You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.2 KiB
199 lines
4.2 KiB
/*****************************************************************************/ |
|
// 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; |
|
|
|
} |
|
|
|
/*****************************************************************************/
|
|
|