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