dng_simple_image::dng_simple_image (const dng_rect &bounds, uint32 planes, uint32 pixelType, uint32 pixelRange, dng_memory_allocator &allocator) : dng_image (bounds, planes, pixelType, pixelRange) , fMemory () , fBuffer () { uint32 pixelSize = TagTypeSize (pixelType); uint32 bytes = bounds.H () * bounds.W () * planes * pixelSize; fMemory.Reset (allocator.Allocate (bytes)); fBuffer.fArea = bounds; fBuffer.fPlane = 0; fBuffer.fPlanes = planes; fBuffer.fRowStep = planes * bounds.W (); fBuffer.fColStep = planes; fBuffer.fPlaneStep = 1; fBuffer.fPixelType = pixelType; fBuffer.fPixelSize = pixelSize; fBuffer.fPixelRange = pixelRange; fBuffer.fData = fMemory->Buffer (); }
void dng_simple_image::Trim (const dng_rect &r) { fBounds.t = 0; fBounds.l = 0; fBounds.b = r.H (); fBounds.r = r.W (); fBuffer.fData = fBuffer.DirtyPixel (r.t, r.l); fBuffer.fArea = fBounds; }
void dng_limit_float_depth_task::Process (uint32 /* threadIndex */, const dng_rect &tile, dng_abort_sniffer * /* sniffer */) { dng_const_tile_buffer srcBuffer (fSrcImage, tile); dng_dirty_tile_buffer dstBuffer (fDstImage, tile); uint32 count0 = tile.H (); uint32 count1 = tile.W (); uint32 count2 = fDstImage.Planes (); int32 sStep0 = srcBuffer.fRowStep; int32 sStep1 = srcBuffer.fColStep; int32 sStep2 = srcBuffer.fPlaneStep; int32 dStep0 = dstBuffer.fRowStep; int32 dStep1 = dstBuffer.fColStep; int32 dStep2 = dstBuffer.fPlaneStep; const void *sPtr = srcBuffer.ConstPixel (tile.t, tile.l, 0); void *dPtr = dstBuffer.DirtyPixel (tile.t, tile.l, 0); OptimizeOrder (sPtr, dPtr, srcBuffer.fPixelSize, dstBuffer.fPixelSize, count0, count1, count2, sStep0, sStep1, sStep2, dStep0, dStep1, dStep2); const real32 *sPtr0 = (const real32 *) sPtr; real32 *dPtr0 = ( real32 *) dPtr; real32 scale = fScale; bool limit16 = (fBitDepth == 16); bool limit24 = (fBitDepth == 24); for (uint32 index0 = 0; index0 < count0; index0++) { const real32 *sPtr1 = sPtr0; real32 *dPtr1 = dPtr0; for (uint32 index1 = 0; index1 < count1; index1++) { // If the scale is a NOP, and the data is packed solid, we can just do memory // copy. if (scale == 1.0f && sStep2 == 1 && dStep2 == 1) { if (dPtr1 != sPtr1) // srcImage != dstImage { memcpy (dPtr1, sPtr1, count2 * (uint32) sizeof (real32)); } } else { const real32 *sPtr2 = sPtr1; real32 *dPtr2 = dPtr1; for (uint32 index2 = 0; index2 < count2; index2++) { real32 x = sPtr2 [0]; x *= scale; dPtr2 [0] = x; sPtr2 += sStep2; dPtr2 += dStep2; } } // The data is now in the destination buffer. if (limit16) { uint32 *dPtr2 = (uint32 *) dPtr1; for (uint32 index2 = 0; index2 < count2; index2++) { uint32 x = dPtr2 [0]; uint16 y = DNG_FloatToHalf (x); x = DNG_HalfToFloat (y); dPtr2 [0] = x; dPtr2 += dStep2; } } else if (limit24) { uint32 *dPtr2 = (uint32 *) dPtr1; for (uint32 index2 = 0; index2 < count2; index2++) { uint32 x = dPtr2 [0]; uint8 temp [3]; DNG_FloatToFP24 (x, temp); x = DNG_FP24ToFloat (temp); dPtr2 [0] = x; dPtr2 += dStep2; } } sPtr1 += sStep1; dPtr1 += dStep1; } sPtr0 += sStep0; dPtr0 += dStep0; } }
void dng_filter_task::Process (uint32 threadIndex, const dng_rect &area, dng_abort_sniffer * /* sniffer */) { // Find source area for this destination area. dng_rect srcArea = SrcArea (area); // Setup srcBuffer. dng_pixel_buffer srcBuffer; srcBuffer.fArea = srcArea; srcBuffer.fPlane = fSrcPlane; srcBuffer.fPlanes = fSrcPlanes; srcBuffer.fPixelType = fSrcPixelType; srcBuffer.fPixelSize = TagTypeSize (fSrcPixelType); srcBuffer.fPlaneStep = RoundUpForPixelSize (srcArea.W (), srcBuffer.fPixelSize); srcBuffer.fRowStep = srcBuffer.fPlaneStep * srcBuffer.fPlanes; if (fSrcPixelType == fSrcImage.PixelType ()) { srcBuffer.fPixelRange = fSrcImage.PixelRange (); } else switch (fSrcPixelType) { case ttByte: case ttSByte: { srcBuffer.fPixelRange = 0x0FF; break; } case ttShort: case ttSShort: { srcBuffer.fPixelRange = 0x0FFFF; break; } case ttLong: case ttSLong: { srcBuffer.fPixelRange = 0xFFFFFFFF; break; } case ttFloat: break; default: ThrowProgramError (); } srcBuffer.fData = fSrcBuffer [threadIndex]->Buffer (); // Setup dstBuffer. dng_pixel_buffer dstBuffer; dstBuffer.fArea = area; dstBuffer.fPlane = fDstPlane; dstBuffer.fPlanes = fDstPlanes; dstBuffer.fPixelType = fDstPixelType; dstBuffer.fPixelSize = TagTypeSize (fDstPixelType); dstBuffer.fPlaneStep = RoundUpForPixelSize (area.W (), dstBuffer.fPixelSize); dstBuffer.fRowStep = dstBuffer.fPlaneStep * dstBuffer.fPlanes; if (fDstPixelType == fDstImage.PixelType ()) { dstBuffer.fPixelRange = fDstImage.PixelRange (); } else switch (fDstPixelType) { case ttByte: case ttSByte: { dstBuffer.fPixelRange = 0x0FF; break; } case ttShort: case ttSShort: { dstBuffer.fPixelRange = 0x0FFFF; break; } case ttLong: case ttSLong: { dstBuffer.fPixelRange = 0xFFFFFFFF; break; } case ttFloat: break; default: ThrowProgramError (); } dstBuffer.fData = fDstBuffer [threadIndex]->Buffer (); // Get source pixels. fSrcImage.Get (srcBuffer, dng_image::edge_repeat, fSrcRepeat.v, fSrcRepeat.h); // Process area. ProcessArea (threadIndex, srcBuffer, dstBuffer); // Save result pixels. fDstImage.Put (dstBuffer); }
void dng_filter_task::Process (uint32 threadIndex, const dng_rect &area, dng_abort_sniffer * /* sniffer */) { // Find source area for this destination area. dng_rect srcArea = SrcArea (area); // Setup srcBuffer. dng_pixel_buffer srcBuffer; srcBuffer.fArea = srcArea; srcBuffer.fPlane = fSrcPlane; srcBuffer.fPlanes = fSrcPlanes; srcBuffer.fPixelType = fSrcPixelType; srcBuffer.fPixelSize = TagTypeSize (fSrcPixelType); srcBuffer.fPlaneStep = RoundUpForPixelSize (srcArea.W (), srcBuffer.fPixelSize); srcBuffer.fRowStep = srcBuffer.fPlaneStep * srcBuffer.fPlanes; srcBuffer.fData = fSrcBuffer [threadIndex]->Buffer (); // Setup dstBuffer. dng_pixel_buffer dstBuffer; dstBuffer.fArea = area; dstBuffer.fPlane = fDstPlane; dstBuffer.fPlanes = fDstPlanes; dstBuffer.fPixelType = fDstPixelType; dstBuffer.fPixelSize = TagTypeSize (fDstPixelType); dstBuffer.fPlaneStep = RoundUpForPixelSize (area.W (), dstBuffer.fPixelSize); dstBuffer.fRowStep = dstBuffer.fPlaneStep * dstBuffer.fPlanes; dstBuffer.fData = fDstBuffer [threadIndex]->Buffer (); // Get source pixels. fSrcImage.Get (srcBuffer, dng_image::edge_repeat, fSrcRepeat.v, fSrcRepeat.h); // Process area. ProcessArea (threadIndex, srcBuffer, dstBuffer); // Save result pixels. fDstImage.Put (dstBuffer); }
dng_gain_map_interpolator::dng_gain_map_interpolator (const dng_gain_map &map, const dng_rect &mapBounds, int32 row, int32 column, uint32 plane) : fMap (map) , fScale (1.0 / mapBounds.H (), 1.0 / mapBounds.W ()) , fOffset (0.5 - mapBounds.t, 0.5 - mapBounds.l) , fColumn (column) , fPlane (plane) , fRowIndex1 (0) , fRowIndex2 (0) , fRowFract (0.0f) , fResetColumn (0) , fValueBase (0.0f) , fValueStep (0.0f) , fValueIndex (0.0f) { real64 rowIndexF = (fScale.v * (row + fOffset.v) - fMap.Origin ().v) / fMap.Spacing ().v; if (rowIndexF <= 0.0) { fRowIndex1 = 0; fRowIndex2 = 0; fRowFract = 0.0f; } else { fRowIndex1 = (uint32) rowIndexF; if ((int32) fRowIndex1 >= fMap.Points ().v - 1) { fRowIndex1 = fMap.Points ().v - 1; fRowIndex2 = fRowIndex1; fRowFract = 0.0f; } else { fRowIndex2 = fRowIndex1 + 1; fRowFract = (real32) (rowIndexF - (real64) fRowIndex1); } } ResetColumn (); }