Home | History | Annotate | Download | only in source
      1 /*****************************************************************************/
      2 // Copyright 2006 Adobe Systems Incorporated
      3 // All Rights Reserved.
      4 //
      5 // NOTICE:  Adobe permits you to use, modify, and distribute this file in
      6 // accordance with the terms of the Adobe license agreement accompanying it.
      7 /*****************************************************************************/
      8 
      9 /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_tile_iterator.cpp#1 $ */
     10 /* $DateTime: 2012/05/30 13:28:51 $ */
     11 /* $Change: 832332 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /*****************************************************************************/
     15 
     16 #include "dng_tile_iterator.h"
     17 
     18 #include "dng_exceptions.h"
     19 #include "dng_image.h"
     20 #include "dng_pixel_buffer.h"
     21 #include "dng_tag_types.h"
     22 #include "dng_utils.h"
     23 
     24 /*****************************************************************************/
     25 
     26 dng_tile_iterator::dng_tile_iterator (const dng_image &image,
     27 									  const dng_rect &area)
     28 
     29 	:	fArea           ()
     30 	,	fTileWidth      (0)
     31 	,	fTileHeight     (0)
     32 	,	fTileTop        (0)
     33 	,	fTileLeft       (0)
     34 	,	fRowLeft        (0)
     35 	,	fLeftPage       (0)
     36 	,	fRightPage      (0)
     37 	,	fTopPage        (0)
     38 	,	fBottomPage     (0)
     39 	,	fHorizontalPage (0)
     40 	,	fVerticalPage   (0)
     41 
     42 	{
     43 
     44 	Initialize (image.RepeatingTile (),
     45 				area & image.Bounds ());
     46 
     47 	}
     48 
     49 /*****************************************************************************/
     50 
     51 dng_tile_iterator::dng_tile_iterator (const dng_point &tileSize,
     52 						   			  const dng_rect &area)
     53 
     54 	:	fArea           ()
     55 	,	fTileWidth      (0)
     56 	,	fTileHeight     (0)
     57 	,	fTileTop        (0)
     58 	,	fTileLeft       (0)
     59 	,	fRowLeft        (0)
     60 	,	fLeftPage       (0)
     61 	,	fRightPage      (0)
     62 	,	fTopPage        (0)
     63 	,	fBottomPage     (0)
     64 	,	fHorizontalPage (0)
     65 	,	fVerticalPage   (0)
     66 
     67 	{
     68 
     69 	dng_rect tile (area);
     70 
     71 	tile.b = Min_int32 (tile.b, tile.t + tileSize.v);
     72 	tile.r = Min_int32 (tile.r, tile.l + tileSize.h);
     73 
     74 	Initialize (tile,
     75 				area);
     76 
     77 	}
     78 
     79 /*****************************************************************************/
     80 
     81 dng_tile_iterator::dng_tile_iterator (const dng_rect &tile,
     82 						   			  const dng_rect &area)
     83 
     84 	:	fArea           ()
     85 	,	fTileWidth      (0)
     86 	,	fTileHeight     (0)
     87 	,	fTileTop        (0)
     88 	,	fTileLeft       (0)
     89 	,	fRowLeft        (0)
     90 	,	fLeftPage       (0)
     91 	,	fRightPage      (0)
     92 	,	fTopPage        (0)
     93 	,	fBottomPage     (0)
     94 	,	fHorizontalPage (0)
     95 	,	fVerticalPage   (0)
     96 
     97 	{
     98 
     99 	Initialize (tile,
    100 				area);
    101 
    102 	}
    103 
    104 /*****************************************************************************/
    105 
    106 void dng_tile_iterator::Initialize (const dng_rect &tile,
    107 						 			const dng_rect &area)
    108 	{
    109 
    110 	fArea = area;
    111 
    112 	if (area.IsEmpty ())
    113 		{
    114 
    115 		fVerticalPage =  0;
    116 		fBottomPage   = -1;
    117 
    118 		return;
    119 
    120 		}
    121 
    122 	int32 vOffset = tile.t;
    123 	int32 hOffset = tile.l;
    124 
    125 	int32 tileHeight = tile.b - vOffset;
    126 	int32 tileWidth  = tile.r - hOffset;
    127 
    128 	fTileHeight = tileHeight;
    129 	fTileWidth  = tileWidth;
    130 
    131 	fLeftPage  = (fArea.l - hOffset    ) / tileWidth;
    132 	fRightPage = (fArea.r - hOffset - 1) / tileWidth;
    133 
    134 	fHorizontalPage = fLeftPage;
    135 
    136 	fTopPage    = (fArea.t - vOffset    ) / tileHeight;
    137 	fBottomPage = (fArea.b - vOffset - 1) / tileHeight;
    138 
    139 	fVerticalPage = fTopPage;
    140 
    141 	fTileLeft = fHorizontalPage * tileWidth  + hOffset;
    142 	fTileTop  = fVerticalPage   * tileHeight + vOffset;
    143 
    144 	fRowLeft = fTileLeft;
    145 
    146 	}
    147 
    148 /*****************************************************************************/
    149 
    150 bool dng_tile_iterator::GetOneTile (dng_rect &tile)
    151 	{
    152 
    153 	if (fVerticalPage > fBottomPage)
    154 		{
    155 		return false;
    156 		}
    157 
    158 	if (fVerticalPage > fTopPage)
    159 		tile.t = fTileTop;
    160 	else
    161 		tile.t = fArea.t;
    162 
    163 	if (fVerticalPage < fBottomPage)
    164 		tile.b = fTileTop + fTileHeight;
    165 	else
    166 		tile.b = fArea.b;
    167 
    168 	if (fHorizontalPage > fLeftPage)
    169 		tile.l = fTileLeft;
    170 	else
    171 		tile.l = fArea.l;
    172 
    173 	if (fHorizontalPage < fRightPage)
    174 		tile.r = fTileLeft + fTileWidth;
    175 	else
    176 		tile.r = fArea.r;
    177 
    178 	if (fHorizontalPage < fRightPage)
    179 		{
    180 		fHorizontalPage++;
    181 		fTileLeft += fTileWidth;
    182 		}
    183 
    184 	else
    185 		{
    186 
    187 		fVerticalPage++;
    188 		fTileTop += fTileHeight;
    189 
    190 		fHorizontalPage = fLeftPage;
    191 		fTileLeft = fRowLeft;
    192 
    193 		}
    194 
    195 	return true;
    196 
    197 	}
    198 
    199 /*****************************************************************************/
    200