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
26dng_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
51dng_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
81dng_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
106void 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
150bool 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