1 /*****************************************************************************/
2 // Copyright 2006-2019 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 #include "dng_filter_task.h"
10 
11 #include "dng_bottlenecks.h"
12 #include "dng_exceptions.h"
13 #include "dng_image.h"
14 #include "dng_memory.h"
15 #include "dng_tag_types.h"
16 #include "dng_tag_values.h"
17 #include "dng_utils.h"
18 
19 /*****************************************************************************/
20 
dng_filter_task(const char * name,const dng_image & srcImage,dng_image & dstImage)21 dng_filter_task::dng_filter_task (const char *name,
22 								  const dng_image &srcImage,
23 						 		  dng_image &dstImage)
24 
25 	:	dng_area_task (name)
26 
27 	,	fSrcImage     (srcImage)
28 	,	fDstImage     (dstImage)
29 
30 	,	fSrcPlane     (0                    )
31 	,	fSrcPlanes    (srcImage.Planes    ())
32 	,	fSrcPixelType (srcImage.PixelType ())
33 
34 	,	fDstPlane     (0                    )
35 	,	fDstPlanes    (dstImage.Planes    ())
36 	,	fDstPixelType (dstImage.PixelType ())
37 
38 	,	fSrcRepeat    (1, 1)
39 	,	fSrcTileSize  (0, 0)
40 
41 	{
42 
43 	}
44 
45 /*****************************************************************************/
46 
~dng_filter_task()47 dng_filter_task::~dng_filter_task ()
48 	{
49 
50 	}
51 
52 /*****************************************************************************/
53 
Start(uint32 threadCount,const dng_rect &,const dng_point & tileSize,dng_memory_allocator * allocator,dng_abort_sniffer *)54 void dng_filter_task::Start (uint32 threadCount,
55 							 const dng_rect & /* dstArea */,
56 							 const dng_point &tileSize,
57 							 dng_memory_allocator *allocator,
58 							 dng_abort_sniffer * /* sniffer */)
59 	{
60 
61 	fSrcTileSize = SrcTileSize (tileSize);
62 
63 	uint32 srcBufferSize = ComputeBufferSize (fSrcPixelType,
64 											  fSrcTileSize,
65 											  fSrcPlanes,
66 											  padSIMDBytes);
67 
68 	uint32 dstBufferSize = ComputeBufferSize (fDstPixelType,
69 											  tileSize,
70 											  fDstPlanes,
71 											  padSIMDBytes);
72 
73 	for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
74 		{
75 
76 		fSrcBuffer [threadIndex] . Reset (allocator->Allocate (srcBufferSize));
77 
78 		fDstBuffer [threadIndex] . Reset (allocator->Allocate (dstBufferSize));
79 
80 		// Zero buffers so any pad bytes have defined values.
81 
82 		DoZeroBytes (fSrcBuffer [threadIndex]->Buffer      (),
83 					 fSrcBuffer [threadIndex]->LogicalSize ());
84 
85 		DoZeroBytes (fDstBuffer [threadIndex]->Buffer      (),
86 					 fDstBuffer [threadIndex]->LogicalSize ());
87 
88 		}
89 
90 	}
91 
92 /*****************************************************************************/
93 
Process(uint32 threadIndex,const dng_rect & area,dng_abort_sniffer *)94 void dng_filter_task::Process (uint32 threadIndex,
95 							   const dng_rect &area,
96 							   dng_abort_sniffer * /* sniffer */)
97 	{
98 
99 	// Find source area for this destination area.
100 
101 	dng_rect srcArea = SrcArea (area);
102 
103 	// Safety check.
104 
105 	int32 src_area_w;
106 	int32 src_area_h;
107 
108 	if (!ConvertUint32ToInt32 (srcArea.W (),
109 							   &src_area_w) ||
110 		!ConvertUint32ToInt32 (srcArea.H (),
111 							   &src_area_h) ||
112 		src_area_w > fSrcTileSize.h ||
113 		src_area_h > fSrcTileSize.v)
114 		{
115 
116 		ThrowMemoryFull ("Area exceeds tile size.");
117 
118 		}
119 
120 	// Setup srcBuffer.
121 
122 	dng_pixel_buffer srcBuffer (srcArea,
123 								fSrcPlane,
124 								fSrcPlanes,
125 								fSrcPixelType,
126 								pcRowInterleavedAlignSIMD,
127 								fSrcBuffer [threadIndex]->Buffer ());
128 
129 	// Setup dstBuffer.
130 
131 	dng_pixel_buffer dstBuffer (area,
132 								fDstPlane,
133 								fDstPlanes,
134 								fDstPixelType,
135 								pcRowInterleavedAlignSIMD,
136 								fDstBuffer [threadIndex]->Buffer ());
137 
138 	// Get source pixels.
139 
140 	fSrcImage.Get (srcBuffer,
141 				   dng_image::edge_repeat,
142 				   fSrcRepeat.v,
143 				   fSrcRepeat.h);
144 
145 	// Process area.
146 
147 	ProcessArea (threadIndex,
148 				 srcBuffer,
149 				 dstBuffer);
150 
151 	// Save result pixels.
152 
153 	fDstImage.Put (dstBuffer);
154 
155 	}
156 
157 /*****************************************************************************/
158