1 /*****************************************************************************/ 2 // Copyright 2006-2008 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_simple_image.cpp#1 $ */ 10 /* $DateTime: 2012/05/30 13:28:51 $ */ 11 /* $Change: 832332 $ */ 12 /* $Author: tknoll $ */ 13 14 /*****************************************************************************/ 15 16 #include "dng_simple_image.h" 17 18 #include "dng_memory.h" 19 #include "dng_orientation.h" 20 #include "dng_tag_types.h" 21 #include "dng_tag_values.h" 22 23 /*****************************************************************************/ 24 25 dng_simple_image::dng_simple_image (const dng_rect &bounds, 26 uint32 planes, 27 uint32 pixelType, 28 dng_memory_allocator &allocator) 29 30 : dng_image (bounds, 31 planes, 32 pixelType) 33 34 , fMemory () 35 , fAllocator (allocator) 36 37 { 38 39 uint32 bytes = 40 ComputeBufferSize (pixelType, bounds.Size (), planes, pad16Bytes); 41 42 fMemory.Reset (allocator.Allocate (bytes)); 43 44 fBuffer = dng_pixel_buffer (bounds, 0, planes, pixelType, pcInterleaved, fMemory->Buffer ()); 45 46 } 47 48 /*****************************************************************************/ 49 50 dng_simple_image::~dng_simple_image () 51 { 52 53 } 54 55 /*****************************************************************************/ 56 57 dng_image * dng_simple_image::Clone () const 58 { 59 60 AutoPtr<dng_simple_image> result (new dng_simple_image (Bounds (), 61 Planes (), 62 PixelType (), 63 fAllocator)); 64 65 result->fBuffer.CopyArea (fBuffer, 66 Bounds (), 67 0, 68 Planes ()); 69 70 return result.Release (); 71 72 } 73 74 /*****************************************************************************/ 75 76 void dng_simple_image::SetPixelType (uint32 pixelType) 77 { 78 79 dng_image::SetPixelType (pixelType); 80 81 fBuffer.fPixelType = pixelType; 82 83 } 84 85 /*****************************************************************************/ 86 87 void dng_simple_image::Trim (const dng_rect &r) 88 { 89 90 fBounds.t = 0; 91 fBounds.l = 0; 92 93 fBounds.b = r.H (); 94 fBounds.r = r.W (); 95 96 fBuffer.fData = fBuffer.DirtyPixel (r.t, r.l); 97 98 fBuffer.fArea = fBounds; 99 100 } 101 102 /*****************************************************************************/ 103 104 void dng_simple_image::Rotate (const dng_orientation &orientation) 105 { 106 107 int32 originH = fBounds.l; 108 int32 originV = fBounds.t; 109 110 int32 colStep = fBuffer.fColStep; 111 int32 rowStep = fBuffer.fRowStep; 112 113 uint32 width = fBounds.W (); 114 uint32 height = fBounds.H (); 115 116 if (orientation.FlipH ()) 117 { 118 119 originH += width - 1; 120 121 colStep = -colStep; 122 123 } 124 125 if (orientation.FlipV ()) 126 { 127 128 originV += height - 1; 129 130 rowStep = -rowStep; 131 132 } 133 134 if (orientation.FlipD ()) 135 { 136 137 int32 temp = colStep; 138 139 colStep = rowStep; 140 rowStep = temp; 141 142 width = fBounds.H (); 143 height = fBounds.W (); 144 145 } 146 147 fBuffer.fData = fBuffer.DirtyPixel (originV, originH); 148 149 fBuffer.fColStep = colStep; 150 fBuffer.fRowStep = rowStep; 151 152 fBounds.r = fBounds.l + width; 153 fBounds.b = fBounds.t + height; 154 155 fBuffer.fArea = fBounds; 156 157 } 158 159 /*****************************************************************************/ 160 161 void dng_simple_image::AcquireTileBuffer (dng_tile_buffer &buffer, 162 const dng_rect &area, 163 bool dirty) const 164 { 165 166 buffer.fArea = area; 167 168 buffer.fPlane = fBuffer.fPlane; 169 buffer.fPlanes = fBuffer.fPlanes; 170 buffer.fRowStep = fBuffer.fRowStep; 171 buffer.fColStep = fBuffer.fColStep; 172 buffer.fPlaneStep = fBuffer.fPlaneStep; 173 buffer.fPixelType = fBuffer.fPixelType; 174 buffer.fPixelSize = fBuffer.fPixelSize; 175 176 buffer.fData = (void *) fBuffer.ConstPixel (buffer.fArea.t, 177 buffer.fArea.l, 178 buffer.fPlane); 179 180 buffer.fDirty = dirty; 181 182 } 183 184 /*****************************************************************************/ 185 186