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_image.cpp
Line
Count
Source
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_image.cpp#1 $ */ 
10
/* $DateTime: 2012/05/30 13:28:51 $ */
11
/* $Change: 832332 $ */
12
/* $Author: tknoll $ */
13
14
/*****************************************************************************/
15
16
#include "dng_image.h"
17
18
#include "dng_assertions.h"
19
#include "dng_exceptions.h"
20
#include "dng_orientation.h"
21
#include "dng_pixel_buffer.h"
22
#include "dng_tag_types.h"
23
#include "dng_tile_iterator.h"
24
#include "dng_utils.h"
25
             
26
/*****************************************************************************/
27
28
dng_tile_buffer::dng_tile_buffer (const dng_image &image,
29
                  const dng_rect &tile,
30
                  bool dirty)
31
                  
32
11.3M
  : fImage   (image)
33
11.3M
  , fRefData (NULL)
34
  
35
11.3M
  {
36
  
37
11.3M
  fImage.AcquireTileBuffer (*this,
38
11.3M
                tile,
39
11.3M
                dirty);
40
  
41
11.3M
  }
42
43
/*****************************************************************************/
44
45
dng_tile_buffer::~dng_tile_buffer ()
46
11.3M
  {
47
  
48
11.3M
  fImage.ReleaseTileBuffer (*this);
49
  
50
11.3M
  }
51
52
/*****************************************************************************/
53
54
dng_const_tile_buffer::dng_const_tile_buffer (const dng_image &image,
55
                          const dng_rect &tile)
56
                          
57
7.05M
  :   dng_tile_buffer (image, tile, false)
58
  
59
7.05M
  {
60
  
61
7.05M
  }
62
63
/*****************************************************************************/
64
65
dng_const_tile_buffer::~dng_const_tile_buffer ()
66
  {
67
  
68
  }
69
70
/*****************************************************************************/
71
72
dng_dirty_tile_buffer::dng_dirty_tile_buffer (dng_image &image,
73
                          const dng_rect &tile)
74
                          
75
4.31M
  :   dng_tile_buffer (image, tile, true)
76
  
77
4.31M
  {
78
  
79
4.31M
  }
80
81
/*****************************************************************************/
82
83
dng_dirty_tile_buffer::~dng_dirty_tile_buffer ()
84
  {
85
  
86
  }
87
88
/*****************************************************************************/
89
90
dng_image::dng_image (const dng_rect &bounds,
91
              uint32 planes,
92
              uint32 pixelType)
93
94
151k
  :   fBounds    (bounds)
95
151k
  , fPlanes    (planes)
96
151k
  , fPixelType (pixelType)
97
  
98
151k
  {
99
  
100
151k
  if (bounds.IsEmpty () || planes == 0 || PixelSize () == 0)
101
846
    {
102
    
103
    #if qDNGValidate
104
    
105
    ReportError ("Fuzz: Attempt to create zero size image");
106
    
107
    #endif
108
    
109
846
    ThrowBadFormat ();
110
    
111
846
    }
112
    
113
151k
  }
114
115
/*****************************************************************************/
116
117
dng_image::~dng_image ()
118
151k
  {
119
  
120
151k
  }
121
122
/*****************************************************************************/
123
124
dng_image * dng_image::Clone () const
125
0
  {
126
  
127
0
  ThrowProgramError ("Clone is not supported by this dng_image subclass");
128
129
0
  return NULL;
130
  
131
0
  }
132
133
/*****************************************************************************/
134
135
void dng_image::SetPixelType (uint32 pixelType)
136
0
  {
137
  
138
0
  if (TagTypeSize (pixelType) != PixelSize ())
139
0
    {
140
    
141
0
    ThrowProgramError ("Cannot change pixel size for existing image");
142
    
143
0
    }
144
  
145
0
  fPixelType = pixelType;
146
  
147
0
  }
148
    
149
/*****************************************************************************/
150
151
uint32 dng_image::PixelSize () const
152
168k
  {
153
  
154
168k
  return TagTypeSize (PixelType ());
155
  
156
168k
  }
157
158
/*****************************************************************************/
159
160
uint32 dng_image::PixelRange () const
161
1.38M
  {
162
  
163
1.38M
  switch (fPixelType)
164
1.38M
    {
165
    
166
0
    case ttByte:
167
0
    case ttSByte:
168
0
      {
169
0
      return 0x0FF;
170
0
      }
171
      
172
1.38M
    case ttShort:
173
1.38M
    case ttSShort:
174
1.38M
      {
175
1.38M
      return 0x0FFFF;
176
1.38M
      }
177
      
178
0
    case ttLong:
179
0
    case ttSLong:
180
0
      {
181
0
      return 0xFFFFFFFF;
182
0
      }
183
      
184
0
    default:
185
0
      break;
186
      
187
1.38M
    }
188
  
189
0
  return 0;
190
  
191
1.38M
  }
192
193
/*****************************************************************************/
194
195
dng_rect dng_image::RepeatingTile () const
196
10.9M
  {
197
  
198
10.9M
  return fBounds;
199
  
200
10.9M
  }
201
202
/*****************************************************************************/
203
204
void dng_image::AcquireTileBuffer (dng_tile_buffer & /* buffer */,
205
                   const dng_rect & /* area */,
206
                   bool /* dirty */) const
207
0
  {
208
  
209
0
  ThrowProgramError ();
210
  
211
0
  }
212
213
/*****************************************************************************/
214
215
void dng_image::ReleaseTileBuffer (dng_tile_buffer & /* buffer */) const
216
11.3M
  {
217
  
218
11.3M
  }
219
220
/*****************************************************************************/
221
222
void dng_image::DoGet (dng_pixel_buffer &buffer) const
223
6.75M
  {
224
  
225
6.75M
  dng_rect tile;
226
  
227
6.75M
  dng_tile_iterator iter (*this, buffer.fArea);
228
  
229
13.5M
  while (iter.GetOneTile (tile))
230
6.75M
    {
231
    
232
6.75M
    dng_const_tile_buffer tileBuffer (*this, tile);
233
    
234
6.75M
    buffer.CopyArea (tileBuffer,
235
6.75M
               tile,
236
6.75M
               buffer.fPlane,
237
6.75M
               buffer.fPlanes);
238
    
239
6.75M
    }
240
  
241
6.75M
  }
242
243
/*****************************************************************************/
244
245
void dng_image::DoPut (const dng_pixel_buffer &buffer)
246
4.02M
  {
247
  
248
4.02M
  dng_rect tile;
249
  
250
4.02M
  dng_tile_iterator iter (*this, buffer.fArea);
251
  
252
8.05M
  while (iter.GetOneTile (tile))
253
4.02M
    {
254
    
255
4.02M
    dng_dirty_tile_buffer tileBuffer (*this, tile);
256
    
257
4.02M
    tileBuffer.CopyArea (buffer,
258
4.02M
                   tile,
259
4.02M
                   buffer.fPlane,
260
4.02M
                   buffer.fPlanes);
261
    
262
4.02M
    }
263
  
264
4.02M
  }
265
  
266
/*****************************************************************************/
267
268
void dng_image::GetRepeat (dng_pixel_buffer &buffer,
269
                   const dng_rect &srcArea,
270
                   const dng_rect &dstArea) const
271
4.62M
  {
272
  
273
  // If we already have the entire srcArea in the
274
  // buffer, we can just repeat that.
275
  
276
4.62M
  if ((srcArea & buffer.fArea) == srcArea)
277
4.62M
    {
278
    
279
4.62M
    buffer.RepeatArea (srcArea,
280
4.62M
               dstArea);
281
    
282
4.62M
    }
283
    
284
  // Else we first need to get the srcArea into the buffer area.
285
  
286
1.82k
  else
287
1.82k
    {
288
    
289
    // Find repeating pattern size.
290
    
291
1.82k
    dng_point repeat = srcArea.Size ();
292
    
293
    // Find pattern phase at top-left corner of destination area.
294
    
295
1.82k
    dng_point phase = dng_pixel_buffer::RepeatPhase (srcArea,
296
1.82k
                               dstArea);
297
      
298
    // Find new source area at top-left of dstArea.
299
    
300
1.82k
    dng_rect newArea = srcArea + (dstArea.TL () -
301
1.82k
                      srcArea.TL ());
302
                     
303
    // Find quadrant split coordinates.
304
    
305
1.82k
    int32 splitV = newArea.t + repeat.v - phase.v;
306
1.82k
    int32 splitH = newArea.l + repeat.h - phase.h;
307
      
308
    // Top-left quadrant.
309
    
310
1.82k
    dng_rect dst1 (dng_rect (newArea.t,
311
1.82k
                   newArea.l,
312
1.82k
                   splitV,
313
1.82k
                   splitH) & dstArea);
314
              
315
1.82k
    if (dst1.NotEmpty ())
316
1.82k
      {
317
      
318
1.82k
      dng_pixel_buffer temp (buffer);
319
      
320
1.82k
      temp.fArea = dst1 + (srcArea.TL () -
321
1.82k
                 dstArea.TL () +
322
1.82k
                 dng_point (phase.v, phase.h));
323
      
324
1.82k
      temp.fData = buffer.DirtyPixel (dst1.t,
325
1.82k
                          dst1.l,
326
1.82k
                          buffer.fPlane);
327
                          
328
1.82k
      DoGet (temp);
329
      
330
1.82k
      }
331
      
332
    // Top-right quadrant.
333
    
334
1.82k
    dng_rect dst2 (dng_rect (newArea.t,
335
1.82k
                 splitH,
336
1.82k
                 splitV,
337
1.82k
                 newArea.r) & dstArea);
338
                 
339
1.82k
    if (dst2.NotEmpty ())
340
0
      {
341
      
342
0
      dng_pixel_buffer temp (buffer);
343
      
344
0
      temp.fArea = dst2 + (srcArea.TL () -
345
0
                 dstArea.TL () +
346
0
                 dng_point (phase.v, -phase.h));
347
      
348
0
      temp.fData = buffer.DirtyPixel (dst2.t,
349
0
                          dst2.l,
350
0
                          buffer.fPlane);
351
                          
352
0
      DoGet (temp);
353
      
354
0
      }
355
      
356
    // Bottom-left quadrant.
357
    
358
1.82k
    dng_rect dst3 (dng_rect (splitV,
359
1.82k
                 newArea.l,
360
1.82k
                 newArea.b,
361
1.82k
                 splitH) & dstArea);
362
                 
363
1.82k
    if (dst3.NotEmpty ())
364
0
      {
365
      
366
0
      dng_pixel_buffer temp (buffer);
367
      
368
0
      temp.fArea = dst3 + (srcArea.TL () -
369
0
                 dstArea.TL () +
370
0
                 dng_point (-phase.v, phase.h));
371
      
372
0
      temp.fData = buffer.DirtyPixel (dst3.t,
373
0
                          dst3.l,
374
0
                          buffer.fPlane);
375
                          
376
0
      DoGet (temp);
377
      
378
0
      }
379
      
380
    // Bottom-right quadrant.
381
    
382
1.82k
    dng_rect dst4 (dng_rect (splitV,
383
1.82k
                 splitH,
384
1.82k
                 newArea.b,
385
1.82k
                 newArea.r) & dstArea);
386
                 
387
1.82k
    if (dst4.NotEmpty ())
388
0
      {
389
      
390
0
      dng_pixel_buffer temp (buffer);
391
      
392
0
      temp.fArea = dst4 + (srcArea.TL () -
393
0
                 dstArea.TL () +
394
0
                 dng_point (-phase.v, -phase.h));
395
      
396
0
      temp.fData = buffer.DirtyPixel (dst4.t,
397
0
                          dst4.l,
398
0
                          buffer.fPlane);
399
                          
400
0
      DoGet (temp);
401
      
402
0
      } 
403
             
404
    // Replicate this new source area.
405
    
406
1.82k
    buffer.RepeatArea (newArea,
407
1.82k
               dstArea);
408
    
409
1.82k
    }
410
      
411
4.62M
  }
412
  
413
/*****************************************************************************/
414
415
void dng_image::GetEdge (dng_pixel_buffer &buffer,
416
               edge_option edgeOption,
417
                 const dng_rect &srcArea,
418
                 const dng_rect &dstArea) const
419
4.84M
  {
420
  
421
4.84M
  switch (edgeOption)
422
4.84M
    {
423
    
424
220k
    case edge_zero:
425
220k
      {
426
      
427
220k
      buffer.SetZero (dstArea,
428
220k
              buffer.fPlane,
429
220k
              buffer.fPlanes);
430
              
431
220k
      break;
432
      
433
0
      }
434
      
435
4.62M
    case edge_repeat:
436
4.62M
      {
437
      
438
4.62M
      GetRepeat (buffer,
439
4.62M
             srcArea,
440
4.62M
             dstArea);
441
             
442
4.62M
      break;
443
            
444
0
      }
445
      
446
0
    case edge_repeat_zero_last:
447
0
      {
448
      
449
0
      if (buffer.fPlanes > 1)
450
0
        {
451
      
452
0
        dng_pixel_buffer buffer1 (buffer);
453
        
454
0
        buffer1.fPlanes--;
455
        
456
0
        GetEdge (buffer1,
457
0
             edge_repeat,
458
0
             srcArea,
459
0
             dstArea);
460
             
461
0
        }
462
        
463
0
      dng_pixel_buffer buffer2 (buffer);
464
      
465
0
      buffer2.fPlane  = buffer.fPlanes - 1;
466
0
      buffer2.fPlanes = 1;
467
      
468
0
      buffer2.fData = buffer.DirtyPixel (buffer2.fArea.t,
469
0
                           buffer2.fArea.l,
470
0
                           buffer2.fPlane);
471
                      
472
0
      GetEdge (buffer2,
473
0
           edge_zero,
474
0
           srcArea,
475
0
           dstArea);
476
           
477
0
      break;
478
      
479
0
      }
480
      
481
0
    default:
482
0
      {
483
      
484
0
      ThrowProgramError ();
485
      
486
0
      }
487
      
488
4.84M
    }
489
  
490
4.84M
  }
491
    
492
/*****************************************************************************/
493
494
void dng_image::Get (dng_pixel_buffer &buffer,
495
           edge_option edgeOption,
496
             uint32 repeatV,
497
             uint32 repeatH) const
498
6.75M
  {
499
  
500
  // Find the overlap with the image bounds.
501
  
502
6.75M
  dng_rect overlap = buffer.fArea & fBounds;
503
  
504
  // Move the overlapping pixels.
505
  
506
6.75M
  if (overlap.NotEmpty ())
507
6.75M
    {
508
  
509
6.75M
    dng_pixel_buffer temp (buffer);
510
    
511
6.75M
    temp.fArea = overlap;
512
    
513
6.75M
    temp.fData = buffer.DirtyPixel (overlap.t,
514
6.75M
                      overlap.l,
515
6.75M
                      buffer.fPlane);
516
  
517
6.75M
    DoGet (temp);
518
    
519
6.75M
    }
520
    
521
  // See if we need to pad the edge values.
522
  
523
6.75M
  if ((edgeOption != edge_none) && (overlap != buffer.fArea))
524
1.99M
    {
525
    
526
1.99M
    dng_rect areaT (buffer.fArea);
527
1.99M
    dng_rect areaL (buffer.fArea);
528
1.99M
    dng_rect areaB (buffer.fArea);
529
1.99M
    dng_rect areaR (buffer.fArea);
530
    
531
1.99M
    areaT.b = Min_int32 (areaT.b, fBounds.t);
532
1.99M
    areaL.r = Min_int32 (areaL.r, fBounds.l);
533
1.99M
    areaB.t = Max_int32 (areaB.t, fBounds.b);
534
1.99M
    areaR.l = Max_int32 (areaR.l, fBounds.r);
535
    
536
1.99M
    dng_rect areaH (buffer.fArea);
537
1.99M
    dng_rect areaV (buffer.fArea);
538
    
539
1.99M
    areaH.l = Max_int32 (areaH.l, fBounds.l);
540
1.99M
    areaH.r = Min_int32 (areaH.r, fBounds.r);
541
    
542
1.99M
    areaV.t = Max_int32 (areaV.t, fBounds.t);
543
1.99M
    areaV.b = Min_int32 (areaV.b, fBounds.b);
544
    
545
    // Top left.
546
    
547
1.99M
    dng_rect areaTL = areaT & areaL;
548
    
549
1.99M
    if (areaTL.NotEmpty ())
550
174k
      {
551
      
552
174k
      GetEdge (buffer,
553
174k
           edgeOption,
554
174k
           dng_rect (fBounds.t,
555
174k
                 fBounds.l,
556
174k
                 fBounds.t + (int32)repeatV,
557
174k
                 fBounds.l + (int32)repeatH),
558
174k
           areaTL);
559
      
560
174k
      }
561
      
562
    // Top middle.
563
    
564
1.99M
    dng_rect areaTM = areaT & areaH;
565
    
566
1.99M
    if (areaTM.NotEmpty ())
567
1.57M
      {
568
      
569
1.57M
      GetEdge (buffer,
570
1.57M
           edgeOption,
571
1.57M
           dng_rect (fBounds.t,
572
1.57M
                 areaTM.l,
573
1.57M
                 fBounds.t + (int32)repeatV,
574
1.57M
                 areaTM.r),
575
1.57M
           areaTM);
576
      
577
1.57M
      }
578
    
579
    // Top right.
580
    
581
1.99M
    dng_rect areaTR = areaT & areaR;
582
    
583
1.99M
    if (areaTR.NotEmpty ())
584
175k
      {
585
      
586
175k
      GetEdge (buffer,
587
175k
           edgeOption,
588
175k
           dng_rect (fBounds.t,
589
175k
                 fBounds.r - (int32)repeatH,
590
175k
                 fBounds.t + (int32)repeatV,
591
175k
                 fBounds.r),
592
175k
           areaTR);
593
      
594
175k
      }
595
      
596
    // Left middle.
597
    
598
1.99M
    dng_rect areaLM = areaL & areaV;
599
    
600
1.99M
    if (areaLM.NotEmpty ())
601
390k
      {
602
      
603
390k
      GetEdge (buffer,
604
390k
           edgeOption,
605
390k
           dng_rect (areaLM.t,
606
390k
                 fBounds.l,
607
390k
                 areaLM.b,
608
390k
                 fBounds.l + (int32)repeatH),
609
390k
           areaLM);
610
      
611
390k
      }
612
    
613
    // Right middle.
614
    
615
1.99M
    dng_rect areaRM = areaR & areaV;
616
    
617
1.99M
    if (areaRM.NotEmpty ())
618
433k
      {
619
      
620
433k
      GetEdge (buffer,
621
433k
           edgeOption,
622
433k
           dng_rect (areaRM.t,
623
433k
                 fBounds.r - (int32)repeatH,
624
433k
                 areaRM.b,
625
433k
                 fBounds.r),
626
433k
           areaRM);
627
      
628
433k
      }
629
    
630
    // Bottom left.
631
    
632
1.99M
    dng_rect areaBL = areaB & areaL;
633
    
634
1.99M
    if (areaBL.NotEmpty ())
635
175k
      {
636
      
637
175k
      GetEdge (buffer,
638
175k
           edgeOption,
639
175k
           dng_rect (fBounds.b - (int32)repeatV,
640
175k
                 fBounds.l,
641
175k
                 fBounds.b,
642
175k
                 fBounds.l + (int32)repeatH),
643
175k
           areaBL);
644
      
645
175k
      }
646
      
647
    // Bottom middle.
648
    
649
1.99M
    dng_rect areaBM = areaB & areaH;
650
    
651
1.99M
    if (areaBM.NotEmpty ())
652
1.73M
      {
653
      
654
1.73M
      GetEdge (buffer,
655
1.73M
           edgeOption,
656
1.73M
           dng_rect (fBounds.b - (int32)repeatV,
657
1.73M
                 areaBM.l,
658
1.73M
                 fBounds.b,
659
1.73M
                 areaBM.r),
660
1.73M
           areaBM);
661
      
662
1.73M
      }
663
    
664
    // Bottom right.
665
    
666
1.99M
    dng_rect areaBR = areaB & areaR;
667
    
668
1.99M
    if (areaBR.NotEmpty ())
669
196k
      {
670
      
671
196k
      GetEdge (buffer,
672
196k
           edgeOption,
673
196k
           dng_rect (fBounds.b - (int32)repeatV,
674
196k
                 fBounds.r - (int32)repeatH,
675
196k
                 fBounds.b,
676
196k
                 fBounds.r),
677
196k
           areaBR);
678
      
679
196k
      }
680
      
681
1.99M
    }
682
  
683
6.75M
  }
684
    
685
/*****************************************************************************/
686
687
void dng_image::Put (const dng_pixel_buffer &buffer)
688
4.03M
  {
689
  
690
  // Move the overlapping pixels.
691
  
692
4.03M
  dng_rect overlap = buffer.fArea & fBounds;
693
  
694
4.03M
  if (overlap.NotEmpty ())
695
4.02M
    {
696
  
697
4.02M
    dng_pixel_buffer temp (buffer);
698
    
699
4.02M
    temp.fArea = overlap;
700
    
701
4.02M
    temp.fData = (void *) buffer.ConstPixel (overlap.t,
702
4.02M
                           overlap.l,
703
4.02M
                           buffer.fPlane);
704
                         
705
    // Move the overlapping planes.
706
                         
707
4.02M
    if (temp.fPlane < Planes ())
708
4.02M
      {
709
      
710
4.02M
      temp.fPlanes = Min_uint32 (temp.fPlanes,
711
4.02M
                     Planes () - temp.fPlane);
712
  
713
4.02M
      DoPut (temp);
714
      
715
4.02M
      }
716
    
717
4.02M
    }
718
    
719
4.03M
  }
720
    
721
/*****************************************************************************/
722
723
void dng_image::Trim (const dng_rect &r)
724
0
  {
725
  
726
0
  if (r != Bounds ())
727
0
    {
728
    
729
0
    ThrowProgramError ("Trim is not support by this dng_image subclass");
730
    
731
0
    }
732
  
733
0
  }
734
    
735
/*****************************************************************************/
736
737
void dng_image::Rotate (const dng_orientation &orientation)
738
0
  {
739
  
740
0
  if (orientation != dng_orientation::Normal ())
741
0
    {
742
    
743
0
    ThrowProgramError ("Rotate is not support by this dng_image subclass");
744
    
745
0
    }
746
  
747
0
  }
748
    
749
/*****************************************************************************/
750
751
void dng_image::CopyArea (const dng_image &src,
752
              const dng_rect &area,
753
              uint32 srcPlane,
754
              uint32 dstPlane,
755
              uint32 planes)
756
0
  {
757
758
0
  if (&src == this)
759
0
    return;
760
761
0
  dng_tile_iterator destIter(*this, area);
762
0
  dng_rect destTileArea;
763
764
0
  while (destIter.GetOneTile(destTileArea))
765
0
    {
766
0
    dng_tile_iterator srcIter(src, destTileArea);
767
0
    dng_rect srcTileArea;
768
769
0
    while (srcIter.GetOneTile(srcTileArea))
770
0
      {
771
772
0
      dng_dirty_tile_buffer destTile(*this, srcTileArea);
773
0
      dng_const_tile_buffer srcTile(src, srcTileArea);
774
775
0
      destTile.CopyArea (srcTile, srcTileArea, srcPlane, dstPlane, planes);
776
777
0
      }
778
779
0
    }
780
781
0
  }
782
783
/*****************************************************************************/
784
785
bool dng_image::EqualArea (const dng_image &src,
786
               const dng_rect &area,
787
               uint32 plane,
788
               uint32 planes) const
789
0
  {
790
791
0
  if (&src == this)
792
0
    return true;
793
794
0
  dng_tile_iterator destIter (*this, area);
795
  
796
0
  dng_rect destTileArea;
797
798
0
  while (destIter.GetOneTile (destTileArea))
799
0
    {
800
    
801
0
    dng_tile_iterator srcIter (src, destTileArea);
802
    
803
0
    dng_rect srcTileArea;
804
805
0
    while (srcIter.GetOneTile (srcTileArea))
806
0
      {
807
808
0
      dng_const_tile_buffer destTile (*this, srcTileArea);
809
0
      dng_const_tile_buffer srcTile  (src  , srcTileArea);
810
811
0
      if (!destTile.EqualArea (srcTile, srcTileArea, plane, planes))
812
0
        {
813
0
        return false;
814
0
        }
815
816
0
      }
817
818
0
    }
819
820
0
  return true;
821
822
0
  }
823
824
/*****************************************************************************/
825
826
void dng_image::SetConstant (uint32 value,
827
               const dng_rect &area)
828
0
  {
829
  
830
0
  dng_tile_iterator iter (*this, area);
831
              
832
0
  dng_rect tileArea;
833
  
834
0
  while (iter.GetOneTile (tileArea))
835
0
    {
836
    
837
0
    dng_dirty_tile_buffer buffer (*this, tileArea);
838
    
839
0
    buffer.SetConstant (tileArea,
840
0
              0,
841
0
              fPlanes,
842
0
              value);
843
          
844
0
    }
845
846
0
  }
847
848
/*****************************************************************************/