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