Coverage Report

Created: 2026-10-27 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dng_sdk/source/dng_area_task.cpp
Line
Count
Source
1
/*****************************************************************************/
2
// Copyright 2006-2012 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_area_task.cpp#1 $ */ 
10
/* $DateTime: 2012/05/30 13:28:51 $ */
11
/* $Change: 832332 $ */
12
/* $Author: tknoll $ */
13
14
/*****************************************************************************/
15
16
#include "dng_area_task.h"
17
18
#include "dng_abort_sniffer.h"
19
#include "dng_flags.h"
20
#include "dng_sdk_limits.h"
21
#include "dng_tile_iterator.h"
22
#include "dng_utils.h"
23
24
#if qImagecore
25
extern bool gPrintTimings;
26
#endif
27
28
/*****************************************************************************/
29
30
dng_area_task::dng_area_task ()
31
32
103k
  : fMaxThreads   (kMaxMPThreads)
33
  
34
103k
  , fMinTaskArea  (256 * 256)
35
  
36
103k
  , fUnitCell   (1, 1)
37
  
38
103k
  , fMaxTileSize  (256, 256)
39
  
40
103k
  {
41
  
42
103k
  }
43
44
/*****************************************************************************/
45
46
dng_area_task::~dng_area_task ()
47
103k
  {
48
  
49
103k
  }
50
51
/*****************************************************************************/
52
53
dng_rect dng_area_task::RepeatingTile1 () const
54
120k
  {
55
  
56
120k
  return dng_rect ();
57
  
58
120k
  }
59
    
60
/*****************************************************************************/
61
62
dng_rect dng_area_task::RepeatingTile2 () const
63
120k
  {
64
  
65
120k
  return dng_rect ();
66
  
67
120k
  }
68
    
69
/*****************************************************************************/
70
71
dng_rect dng_area_task::RepeatingTile3 () const
72
206k
  {
73
  
74
206k
  return dng_rect ();
75
  
76
206k
  }
77
    
78
/*****************************************************************************/
79
80
void dng_area_task::Start (uint32 /* threadCount */,
81
               const dng_point & /* tileSize */,
82
               dng_memory_allocator * /* allocator */,
83
               dng_abort_sniffer * /* sniffer */)
84
55.7k
  {
85
  
86
55.7k
  }
87
88
/*****************************************************************************/
89
90
void dng_area_task::Finish (uint32 /* threadCount */)
91
103k
  {
92
  
93
103k
  }
94
  
95
/*****************************************************************************/
96
97
dng_point dng_area_task::FindTileSize (const dng_rect &area) const
98
103k
  {
99
  
100
103k
  dng_rect repeatingTile1 = RepeatingTile1 ();
101
103k
  dng_rect repeatingTile2 = RepeatingTile2 ();
102
103k
  dng_rect repeatingTile3 = RepeatingTile3 ();
103
  
104
103k
  if (repeatingTile1.IsEmpty ())
105
60.4k
    {
106
60.4k
    repeatingTile1 = area;
107
60.4k
    }
108
  
109
103k
  if (repeatingTile2.IsEmpty ())
110
60.4k
    {
111
60.4k
    repeatingTile2 = area;
112
60.4k
    }
113
  
114
103k
  if (repeatingTile3.IsEmpty ())
115
103k
    {
116
103k
    repeatingTile3 = area;
117
103k
    }
118
    
119
103k
  uint32 repeatV = Min_uint32 (Min_uint32 (repeatingTile1.H (),
120
103k
                       repeatingTile2.H ()),
121
103k
                       repeatingTile3.H ());
122
  
123
103k
  uint32 repeatH = Min_uint32 (Min_uint32 (repeatingTile1.W (),
124
103k
                       repeatingTile2.W ()),
125
103k
                       repeatingTile3.W ());
126
  
127
103k
  dng_point maxTileSize = MaxTileSize ();
128
129
103k
  dng_point tileSize;
130
    
131
103k
  tileSize.v = Min_int32 (repeatV, maxTileSize.v);
132
103k
  tileSize.h = Min_int32 (repeatH, maxTileSize.h);
133
  
134
  // What this is doing is, if the smallest repeating image tile is larger than the 
135
  // maximum tile size, adjusting the tile size down so that the tiles are as small
136
  // as possible while still having the same number of tiles covering the
137
  // repeat area.  This makes the areas more equal in size, making MP
138
  // algorithms work better.
139
            
140
  // The image core team did not understand this code, and disabled it.
141
  // Really stupid idea to turn off code you don't understand!
142
  // I'm undoing this removal, because I think the code is correct and useful.
143
144
103k
  uint32 countV = (repeatV + tileSize.v - 1) / tileSize.v;
145
103k
  uint32 countH = (repeatH + tileSize.h - 1) / tileSize.h;
146
  
147
103k
  tileSize.v = (repeatV + countV - 1) / countV;
148
103k
  tileSize.h = (repeatH + countH - 1) / countH;
149
  
150
  // Round up to unit cell size.
151
  
152
103k
  dng_point unitCell = UnitCell ();
153
  
154
103k
  if (unitCell.h != 1 || unitCell.v != 1)
155
42.1k
    {
156
42.1k
    tileSize.v = ((tileSize.v + unitCell.v - 1) / unitCell.v) * unitCell.v;
157
42.1k
    tileSize.h = ((tileSize.h + unitCell.h - 1) / unitCell.h) * unitCell.h;
158
42.1k
    }
159
    
160
  // But if that is larger than maximum tile size, round down to unit cell size.
161
  
162
103k
  if (tileSize.v > maxTileSize.v)
163
338
    {
164
338
    tileSize.v = (maxTileSize.v / unitCell.v) * unitCell.v;
165
338
    }
166
167
103k
  if (tileSize.h > maxTileSize.h)
168
418
    {
169
418
    tileSize.h = (maxTileSize.h / unitCell.h) * unitCell.h;
170
418
    }
171
    
172
  #if qImagecore  
173
    if (gPrintTimings)
174
    {
175
        fprintf (stdout, "\nRender tile for below: %d x %d\n", (int32) tileSize.h, (int32) tileSize.v);
176
    } 
177
  #endif
178
179
103k
  return tileSize;
180
  
181
103k
  }
182
    
183
/*****************************************************************************/
184
185
void dng_area_task::ProcessOnThread (uint32 threadIndex,
186
                   const dng_rect &area,
187
                   const dng_point &tileSize,
188
                   dng_abort_sniffer *sniffer)
189
103k
  {
190
  
191
103k
  dng_rect repeatingTile1 = RepeatingTile1 ();
192
103k
  dng_rect repeatingTile2 = RepeatingTile2 ();
193
103k
  dng_rect repeatingTile3 = RepeatingTile3 ();
194
  
195
103k
  if (repeatingTile1.IsEmpty ())
196
60.3k
    {
197
60.3k
    repeatingTile1 = area;
198
60.3k
    }
199
  
200
103k
  if (repeatingTile2.IsEmpty ())
201
60.3k
    {
202
60.3k
    repeatingTile2 = area;
203
60.3k
    }
204
  
205
103k
  if (repeatingTile3.IsEmpty ())
206
103k
    {
207
103k
    repeatingTile3 = area;
208
103k
    }
209
    
210
103k
  dng_rect tile1;
211
  
212
103k
  dng_tile_iterator iter1 (repeatingTile3, area);
213
  
214
206k
  while (iter1.GetOneTile (tile1))
215
103k
    {
216
    
217
103k
    dng_rect tile2;
218
    
219
103k
    dng_tile_iterator iter2 (repeatingTile2, tile1);
220
    
221
206k
    while (iter2.GetOneTile (tile2))
222
103k
      {
223
      
224
103k
      dng_rect tile3;
225
      
226
103k
      dng_tile_iterator iter3 (repeatingTile1, tile2);
227
      
228
206k
      while (iter3.GetOneTile (tile3))
229
103k
        {
230
        
231
103k
        dng_rect tile4;
232
        
233
103k
        dng_tile_iterator iter4 (tileSize, tile3);
234
        
235
4.23M
        while (iter4.GetOneTile (tile4))
236
4.13M
          {
237
          
238
4.13M
          dng_abort_sniffer::SniffForAbort (sniffer);
239
          
240
4.13M
          Process (threadIndex, tile4, sniffer);
241
          
242
4.13M
          }
243
          
244
103k
        }
245
        
246
103k
      }
247
    
248
103k
    }
249
  
250
103k
  }
251
    
252
/*****************************************************************************/
253
254
void dng_area_task::Perform (dng_area_task &task,
255
                 const dng_rect &area,
256
                 dng_memory_allocator *allocator,
257
                 dng_abort_sniffer *sniffer)
258
103k
  {
259
  
260
103k
  dng_point tileSize (task.FindTileSize (area));
261
    
262
103k
  task.Start (1, tileSize, allocator, sniffer);
263
  
264
103k
  task.ProcessOnThread (0, area, tileSize, sniffer);
265
      
266
103k
  task.Finish (1);
267
  
268
103k
  }
269
270
/*****************************************************************************/