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
dng_tile_iterator(const dng_image & image,const dng_rect & area)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
dng_tile_iterator(const dng_point & tileSize,const dng_rect & area)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
dng_tile_iterator(const dng_rect & tile,const dng_rect & area)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
Initialize(const dng_rect & tile,const dng_rect & area)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
GetOneTile(dng_rect & tile)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