/*****************************************************************************/ // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_tile_iterator.cpp#1 $ */ /* $DateTime: 2012/05/30 13:28:51 $ */ /* $Change: 832332 $ */ /* $Author: tknoll $ */ /*****************************************************************************/ #include "dng_tile_iterator.h" #include "dng_exceptions.h" #include "dng_image.h" #include "dng_pixel_buffer.h" #include "dng_tag_types.h" #include "dng_utils.h" /*****************************************************************************/ dng_tile_iterator::dng_tile_iterator (const dng_image &image, const dng_rect &area) : fArea () , fTileWidth (0) , fTileHeight (0) , fTileTop (0) , fTileLeft (0) , fRowLeft (0) , fLeftPage (0) , fRightPage (0) , fTopPage (0) , fBottomPage (0) , fHorizontalPage (0) , fVerticalPage (0) { Initialize (image.RepeatingTile (), area & image.Bounds ()); } /*****************************************************************************/ dng_tile_iterator::dng_tile_iterator (const dng_point &tileSize, const dng_rect &area) : fArea () , fTileWidth (0) , fTileHeight (0) , fTileTop (0) , fTileLeft (0) , fRowLeft (0) , fLeftPage (0) , fRightPage (0) , fTopPage (0) , fBottomPage (0) , fHorizontalPage (0) , fVerticalPage (0) { dng_rect tile (area); tile.b = Min_int32 (tile.b, tile.t + tileSize.v); tile.r = Min_int32 (tile.r, tile.l + tileSize.h); Initialize (tile, area); } /*****************************************************************************/ dng_tile_iterator::dng_tile_iterator (const dng_rect &tile, const dng_rect &area) : fArea () , fTileWidth (0) , fTileHeight (0) , fTileTop (0) , fTileLeft (0) , fRowLeft (0) , fLeftPage (0) , fRightPage (0) , fTopPage (0) , fBottomPage (0) , fHorizontalPage (0) , fVerticalPage (0) { Initialize (tile, area); } /*****************************************************************************/ void dng_tile_iterator::Initialize (const dng_rect &tile, const dng_rect &area) { fArea = area; if (area.IsEmpty ()) { fVerticalPage = 0; fBottomPage = -1; return; } int32 vOffset = tile.t; int32 hOffset = tile.l; int32 tileHeight = tile.b - vOffset; int32 tileWidth = tile.r - hOffset; fTileHeight = tileHeight; fTileWidth = tileWidth; fLeftPage = (fArea.l - hOffset ) / tileWidth; fRightPage = (fArea.r - hOffset - 1) / tileWidth; fHorizontalPage = fLeftPage; fTopPage = (fArea.t - vOffset ) / tileHeight; fBottomPage = (fArea.b - vOffset - 1) / tileHeight; fVerticalPage = fTopPage; fTileLeft = fHorizontalPage * tileWidth + hOffset; fTileTop = fVerticalPage * tileHeight + vOffset; fRowLeft = fTileLeft; } /*****************************************************************************/ bool dng_tile_iterator::GetOneTile (dng_rect &tile) { if (fVerticalPage > fBottomPage) { return false; } if (fVerticalPage > fTopPage) tile.t = fTileTop; else tile.t = fArea.t; if (fVerticalPage < fBottomPage) tile.b = fTileTop + fTileHeight; else tile.b = fArea.b; if (fHorizontalPage > fLeftPage) tile.l = fTileLeft; else tile.l = fArea.l; if (fHorizontalPage < fRightPage) tile.r = fTileLeft + fTileWidth; else tile.r = fArea.r; if (fHorizontalPage < fRightPage) { fHorizontalPage++; fTileLeft += fTileWidth; } else { fVerticalPage++; fTileTop += fTileHeight; fHorizontalPage = fLeftPage; fTileLeft = fRowLeft; } return true; } /*****************************************************************************/