/*****************************************************************************/
// 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;
}
/*****************************************************************************/