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 
dng_simple_image(const dng_rect & bounds,uint32 planes,uint32 pixelType,dng_memory_allocator & allocator)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 
~dng_simple_image()50 dng_simple_image::~dng_simple_image ()
51 	{
52 
53 	}
54 
55 /*****************************************************************************/
56 
Clone() const57 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 
SetPixelType(uint32 pixelType)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 
Trim(const dng_rect & r)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 
Rotate(const dng_orientation & orientation)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 
AcquireTileBuffer(dng_tile_buffer & buffer,const dng_rect & area,bool dirty) const161 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