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); }
void dng_image::Get (dng_pixel_buffer &buffer, edge_option edgeOption, uint32 repeatV, uint32 repeatH) const { // Find the overlap with the image bounds. dng_rect overlap = buffer.fArea & fBounds; // Move the overlapping pixels. if (overlap.NotEmpty ()) { dng_pixel_buffer temp (buffer); temp.fArea = overlap; temp.fData = buffer.DirtyPixel (overlap.t, overlap.l, buffer.fPlane); DoGet (temp); } // See if we need to pad the edge values. if ((edgeOption != edge_none) && (overlap != buffer.fArea)) { dng_rect areaT (buffer.fArea); dng_rect areaL (buffer.fArea); dng_rect areaB (buffer.fArea); dng_rect areaR (buffer.fArea); areaT.b = Min_int32 (areaT.b, fBounds.t); areaL.r = Min_int32 (areaL.r, fBounds.l); areaB.t = Max_int32 (areaB.t, fBounds.b); areaR.l = Max_int32 (areaR.l, fBounds.r); dng_rect areaH (buffer.fArea); dng_rect areaV (buffer.fArea); areaH.l = Max_int32 (areaH.l, fBounds.l); areaH.r = Min_int32 (areaH.r, fBounds.r); areaV.t = Max_int32 (areaV.t, fBounds.t); areaV.b = Min_int32 (areaV.b, fBounds.b); // Top left. dng_rect areaTL = areaT & areaL; if (areaTL.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.t, fBounds.l, fBounds.t + (int32)repeatV, fBounds.l + (int32)repeatH), areaTL); } // Top middle. dng_rect areaTM = areaT & areaH; if (areaTM.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.t, areaTM.l, fBounds.t + (int32)repeatV, areaTM.r), areaTM); } // Top right. dng_rect areaTR = areaT & areaR; if (areaTR.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.t, fBounds.r - (int32)repeatH, fBounds.t + (int32)repeatV, fBounds.r), areaTR); } // Left middle. dng_rect areaLM = areaL & areaV; if (areaLM.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (areaLM.t, fBounds.l, areaLM.b, fBounds.l + (int32)repeatH), areaLM); } // Right middle. dng_rect areaRM = areaR & areaV; if (areaRM.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (areaRM.t, fBounds.r - (int32)repeatH, areaRM.b, fBounds.r), areaRM); } // Bottom left. dng_rect areaBL = areaB & areaL; if (areaBL.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.b - (int32)repeatV, fBounds.l, fBounds.b, fBounds.l + (int32)repeatH), areaBL); } // Bottom middle. dng_rect areaBM = areaB & areaH; if (areaBM.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.b - (int32)repeatV, areaBM.l, fBounds.b, areaBM.r), areaBM); } // Bottom right. dng_rect areaBR = areaB & areaR; if (areaBR.NotEmpty ()) { GetEdge (buffer, edgeOption, dng_rect (fBounds.b - (int32)repeatV, fBounds.r - (int32)repeatH, fBounds.b, fBounds.r), areaBR); } } }
dng_point dng_area_task::FindTileSize (const dng_rect &area) const { dng_rect repeatingTile1 = RepeatingTile1 (); dng_rect repeatingTile2 = RepeatingTile2 (); dng_rect repeatingTile3 = RepeatingTile3 (); if (repeatingTile1.IsEmpty ()) { repeatingTile1 = area; } if (repeatingTile2.IsEmpty ()) { repeatingTile2 = area; } if (repeatingTile3.IsEmpty ()) { repeatingTile3 = area; } uint32 repeatV = Min_uint32 (Min_uint32 (repeatingTile1.H (), repeatingTile2.H ()), repeatingTile3.H ()); uint32 repeatH = Min_uint32 (Min_uint32 (repeatingTile1.W (), repeatingTile2.W ()), repeatingTile3.W ()); dng_point maxTileSize = MaxTileSize (); dng_point tileSize (maxTileSize); tileSize.v = Min_int32 (tileSize.v, repeatV); tileSize.h = Min_int32 (tileSize.h, repeatH); uint32 countV = (repeatV + tileSize.v - 1) / tileSize.v; uint32 countH = (repeatH + tileSize.h - 1) / tileSize.h; tileSize.v = (repeatV + countV - 1) / countV; tileSize.h = (repeatH + countH - 1) / countH; dng_point unitCell = UnitCell (); tileSize.v = ((tileSize.v + unitCell.v - 1) / unitCell.v) * unitCell.v; tileSize.h = ((tileSize.h + unitCell.h - 1) / unitCell.h) * unitCell.h; if (tileSize.v > maxTileSize.v) { tileSize.v = (maxTileSize.v / unitCell.v) * unitCell.v; } if (tileSize.h > maxTileSize.h) { tileSize.h = (maxTileSize.h / unitCell.h) * unitCell.h; } return tileSize; }