Coverage Report

Created: 2026-09-04 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dng_sdk/source/dng_reference.cpp
Line
Count
Source
1
/*****************************************************************************/
2
// Copyright 2006-2009 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_reference.cpp#1 $ */ 
10
/* $DateTime: 2012/05/30 13:28:51 $ */
11
/* $Change: 832332 $ */
12
/* $Author: tknoll $ */
13
14
/*****************************************************************************/
15
16
#include "dng_reference.h"
17
18
#include "dng_1d_table.h"
19
#include "dng_hue_sat_map.h"
20
#include "dng_matrix.h"
21
#include "dng_resample.h"
22
#include "dng_utils.h"
23
           
24
/*****************************************************************************/
25
26
// This module contains routines that should be as fast as possible, even
27
// at the expense of slight code size increases.
28
29
#include "dng_fast_module.h"
30
31
/*****************************************************************************/
32
33
void RefZeroBytes (void *dPtr,
34
           uint32 count)
35
256k
  {
36
  
37
256k
  memset (dPtr, 0, count);
38
  
39
256k
  }
40
           
41
/*****************************************************************************/
42
43
void RefCopyBytes (const void *sPtr,
44
           void *dPtr,
45
           uint32 count)
46
713M
  {
47
  
48
713M
  memcpy (dPtr, sPtr, count);
49
  
50
713M
  }
51
           
52
/*****************************************************************************/
53
54
void RefSwapBytes16 (uint16 *dPtr,
55
             uint32 count)
56
0
  {
57
  
58
0
  for (uint32 j = 0; j < count; j++)
59
0
    {
60
    
61
0
    dPtr [j] = SwapBytes16 (dPtr [j]);
62
    
63
0
    }
64
    
65
0
  }
66
           
67
/*****************************************************************************/
68
69
void RefSwapBytes32 (uint32 *dPtr,
70
             uint32 count)
71
0
  {
72
  
73
0
  for (uint32 j = 0; j < count; j++)
74
0
    {
75
    
76
0
    dPtr [j] = SwapBytes32 (dPtr [j]);
77
    
78
0
    }
79
    
80
0
  }
81
           
82
/*****************************************************************************/
83
84
void RefSetArea8 (uint8 *dPtr,
85
          uint8 value,
86
          uint32 rows,
87
          uint32 cols,
88
          uint32 planes,
89
          int32 rowStep,
90
          int32 colStep,
91
          int32 planeStep)
92
10.5k
  {
93
  
94
330k
  for (uint32 row = 0; row < rows; row++)
95
319k
    {
96
    
97
319k
    uint8 *dPtr1 = dPtr;
98
          
99
1.99M
    for (uint32 col = 0; col < cols; col++)
100
1.67M
      {
101
      
102
1.67M
      uint8 *dPtr2 = dPtr1;
103
            
104
47.9M
      for (uint32 plane = 0; plane < planes; plane++)
105
46.3M
        {
106
      
107
46.3M
        *dPtr2 = value;
108
        
109
46.3M
        dPtr2 += planeStep;
110
        
111
46.3M
        }
112
      
113
1.67M
      dPtr1 += colStep;
114
115
1.67M
      }
116
      
117
319k
    dPtr += rowStep;
118
    
119
319k
    }
120
      
121
10.5k
  }
122
123
/*****************************************************************************/
124
125
void RefSetArea16 (uint16 *dPtr,
126
           uint16 value,
127
           uint32 rows,
128
           uint32 cols,
129
           uint32 planes,
130
           int32 rowStep,
131
           int32 colStep,
132
           int32 planeStep)
133
27.2k
  {
134
  
135
978k
  for (uint32 row = 0; row < rows; row++)
136
951k
    {
137
    
138
951k
    uint16 *dPtr1 = dPtr;
139
          
140
11.6M
    for (uint32 col = 0; col < cols; col++)
141
10.6M
      {
142
      
143
10.6M
      uint16 *dPtr2 = dPtr1;
144
            
145
184M
      for (uint32 plane = 0; plane < planes; plane++)
146
173M
        {
147
      
148
173M
        *dPtr2 = value;
149
        
150
173M
        dPtr2 += planeStep;
151
        
152
173M
        }
153
      
154
10.6M
      dPtr1 += colStep;
155
156
10.6M
      }
157
      
158
951k
    dPtr += rowStep;
159
    
160
951k
    }
161
      
162
27.2k
  }
163
164
/*****************************************************************************/
165
166
void RefSetArea32 (uint32 *dPtr,
167
           uint32 value,
168
           uint32 rows,
169
             uint32 cols,
170
           uint32 planes,
171
           int32 rowStep,
172
           int32 colStep,
173
           int32 planeStep)
174
11.0k
  {
175
  
176
384k
  for (uint32 row = 0; row < rows; row++)
177
373k
    {
178
    
179
373k
    uint32 *dPtr1 = dPtr;
180
          
181
3.20M
    for (uint32 col = 0; col < cols; col++)
182
2.83M
      {
183
      
184
2.83M
      uint32 *dPtr2 = dPtr1;
185
            
186
52.3M
      for (uint32 plane = 0; plane < planes; plane++)
187
49.5M
        {
188
      
189
49.5M
        *dPtr2 = value;
190
        
191
49.5M
        dPtr2 += planeStep;
192
        
193
49.5M
        }
194
      
195
2.83M
      dPtr1 += colStep;
196
197
2.83M
      }
198
      
199
373k
    dPtr += rowStep;
200
    
201
373k
    }
202
      
203
11.0k
  }
204
205
/*****************************************************************************/
206
207
void RefCopyArea8 (const uint8 *sPtr,
208
           uint8 *dPtr,
209
           uint32 rows,
210
           uint32 cols,
211
           uint32 planes,
212
           int32 sRowStep,
213
           int32 sColStep,
214
           int32 sPlaneStep,
215
           int32 dRowStep,
216
           int32 dColStep,
217
           int32 dPlaneStep)
218
39.6k
  {
219
  
220
7.47M
  for (uint32 row = 0; row < rows; row++)
221
7.43M
    {
222
    
223
7.43M
    const uint8 *sPtr1 = sPtr;
224
7.43M
          uint8 *dPtr1 = dPtr;
225
          
226
215M
    for (uint32 col = 0; col < cols; col++)
227
208M
      {
228
      
229
208M
      const uint8 *sPtr2 = sPtr1;
230
208M
            uint8 *dPtr2 = dPtr1;
231
            
232
3.27G
      for (uint32 plane = 0; plane < planes; plane++)
233
3.06G
        {
234
      
235
3.06G
        *dPtr2 = *sPtr2;
236
        
237
3.06G
        sPtr2 += sPlaneStep;
238
3.06G
        dPtr2 += dPlaneStep;
239
        
240
3.06G
        }
241
      
242
208M
      sPtr1 += sColStep;
243
208M
      dPtr1 += dColStep;
244
245
208M
      }
246
      
247
7.43M
    sPtr += sRowStep;
248
7.43M
    dPtr += dRowStep;
249
    
250
7.43M
    }
251
    
252
39.6k
  }
253
254
/*****************************************************************************/
255
256
void RefCopyArea16 (const uint16 *sPtr,
257
          uint16 *dPtr,
258
          uint32 rows,
259
          uint32 cols,
260
          uint32 planes,
261
          int32 sRowStep,
262
          int32 sColStep,
263
          int32 sPlaneStep,
264
          int32 dRowStep,
265
          int32 dColStep,
266
          int32 dPlaneStep)
267
841k
  {
268
  
269
4.75M
  for (uint32 row = 0; row < rows; row++)
270
3.91M
    {
271
    
272
3.91M
    const uint16 *sPtr1 = sPtr;
273
3.91M
          uint16 *dPtr1 = dPtr;
274
          
275
248M
    for (uint32 col = 0; col < cols; col++)
276
244M
      {
277
      
278
244M
      const uint16 *sPtr2 = sPtr1;
279
244M
            uint16 *dPtr2 = dPtr1;
280
            
281
7.88G
      for (uint32 plane = 0; plane < planes; plane++)
282
7.64G
        {
283
      
284
7.64G
        *dPtr2 = *sPtr2;
285
        
286
7.64G
        sPtr2 += sPlaneStep;
287
7.64G
        dPtr2 += dPlaneStep;
288
        
289
7.64G
        }
290
      
291
244M
      sPtr1 += sColStep;
292
244M
      dPtr1 += dColStep;
293
294
244M
      }
295
      
296
3.91M
    sPtr += sRowStep;
297
3.91M
    dPtr += dRowStep;
298
    
299
3.91M
    }
300
    
301
841k
  }
302
303
/*****************************************************************************/
304
305
void RefCopyArea32 (const uint32 *sPtr,
306
          uint32 *dPtr,
307
          uint32 rows,
308
          uint32 cols,
309
          uint32 planes,
310
          int32 sRowStep,
311
          int32 sColStep,
312
          int32 sPlaneStep,
313
          int32 dRowStep,
314
          int32 dColStep,
315
          int32 dPlaneStep)
316
658k
  {
317
    
318
2.40M
  for (uint32 row = 0; row < rows; row++)
319
1.74M
    {
320
    
321
1.74M
    const uint32 *sPtr1 = sPtr;
322
1.74M
          uint32 *dPtr1 = dPtr;
323
          
324
129M
    for (uint32 col = 0; col < cols; col++)
325
127M
      {
326
      
327
127M
      const uint32 *sPtr2 = sPtr1;
328
127M
            uint32 *dPtr2 = dPtr1;
329
            
330
3.72G
      for (uint32 plane = 0; plane < planes; plane++)
331
3.59G
        {
332
      
333
3.59G
        *dPtr2 = *sPtr2;
334
        
335
3.59G
        sPtr2 += sPlaneStep;
336
3.59G
        dPtr2 += dPlaneStep;
337
        
338
3.59G
        }
339
      
340
127M
      sPtr1 += sColStep;
341
127M
      dPtr1 += dColStep;
342
343
127M
      }
344
      
345
1.74M
    sPtr += sRowStep;
346
1.74M
    dPtr += dRowStep;
347
    
348
1.74M
    }
349
    
350
658k
  }
351
352
/*****************************************************************************/
353
354
void RefCopyArea8_16 (const uint8 *sPtr,
355
            uint16 *dPtr,
356
            uint32 rows,
357
            uint32 cols,
358
            uint32 planes,
359
            int32 sRowStep,
360
            int32 sColStep,
361
            int32 sPlaneStep,
362
            int32 dRowStep,
363
            int32 dColStep,
364
            int32 dPlaneStep)
365
9.31k
  {
366
  
367
18.6k
  for (uint32 row = 0; row < rows; row++)
368
9.31k
    {
369
    
370
9.31k
    const uint8  *sPtr1 = sPtr;
371
9.31k
          uint16 *dPtr1 = dPtr;
372
          
373
18.6k
    for (uint32 col = 0; col < cols; col++)
374
9.31k
      {
375
      
376
9.31k
      const uint8  *sPtr2 = sPtr1;
377
9.31k
            uint16 *dPtr2 = dPtr1;
378
            
379
93.1M
      for (uint32 plane = 0; plane < planes; plane++)
380
93.1M
        {
381
      
382
93.1M
        *dPtr2 = *sPtr2;
383
        
384
93.1M
        sPtr2 += sPlaneStep;
385
93.1M
        dPtr2 += dPlaneStep;
386
        
387
93.1M
        }
388
      
389
9.31k
      sPtr1 += sColStep;
390
9.31k
      dPtr1 += dColStep;
391
392
9.31k
      }
393
      
394
9.31k
    sPtr += sRowStep;
395
9.31k
    dPtr += dRowStep;
396
    
397
9.31k
    }
398
    
399
9.31k
  }
400
401
/*****************************************************************************/
402
403
void RefCopyArea8_S16 (const uint8 *sPtr,
404
             int16 *dPtr,
405
             uint32 rows,
406
             uint32 cols,
407
             uint32 planes,
408
             int32 sRowStep,
409
             int32 sColStep,
410
             int32 sPlaneStep,
411
             int32 dRowStep,
412
             int32 dColStep,
413
             int32 dPlaneStep)
414
0
  {
415
  
416
0
  for (uint32 row = 0; row < rows; row++)
417
0
    {
418
    
419
0
    const uint8 *sPtr1 = sPtr;
420
0
          int16 *dPtr1 = dPtr;
421
          
422
0
    for (uint32 col = 0; col < cols; col++)
423
0
      {
424
      
425
0
      const uint8 *sPtr2 = sPtr1;
426
0
            int16 *dPtr2 = dPtr1;
427
            
428
0
      for (uint32 plane = 0; plane < planes; plane++)
429
0
        {
430
        
431
0
        int16 x = *sPtr;
432
        
433
0
        *dPtr2 = x ^ 0x8000;
434
        
435
0
        sPtr2 += sPlaneStep;
436
0
        dPtr2 += dPlaneStep;
437
        
438
0
        }
439
      
440
0
      sPtr1 += sColStep;
441
0
      dPtr1 += dColStep;
442
443
0
      }
444
      
445
0
    sPtr += sRowStep;
446
0
    dPtr += dRowStep;
447
    
448
0
    }
449
    
450
0
  }
451
452
/*****************************************************************************/
453
454
void RefCopyArea8_32 (const uint8 *sPtr,
455
            uint32 *dPtr,
456
            uint32 rows,
457
            uint32 cols,
458
            uint32 planes,
459
            int32 sRowStep,
460
            int32 sColStep,
461
            int32 sPlaneStep,
462
            int32 dRowStep,
463
            int32 dColStep,
464
            int32 dPlaneStep)
465
0
  {
466
  
467
0
  for (uint32 row = 0; row < rows; row++)
468
0
    {
469
    
470
0
    const uint8  *sPtr1 = sPtr;
471
0
          uint32 *dPtr1 = dPtr;
472
          
473
0
    for (uint32 col = 0; col < cols; col++)
474
0
      {
475
      
476
0
      const uint8  *sPtr2 = sPtr1;
477
0
            uint32 *dPtr2 = dPtr1;
478
            
479
0
      for (uint32 plane = 0; plane < planes; plane++)
480
0
        {
481
      
482
0
        *dPtr2 = *sPtr2;
483
        
484
0
        sPtr2 += sPlaneStep;
485
0
        dPtr2 += dPlaneStep;
486
        
487
0
        }
488
      
489
0
      sPtr1 += sColStep;
490
0
      dPtr1 += dColStep;
491
492
0
      }
493
      
494
0
    sPtr += sRowStep;
495
0
    dPtr += dRowStep;
496
    
497
0
    }
498
    
499
0
  }
500
501
/*****************************************************************************/
502
503
void RefCopyArea16_S16 (const uint16 *sPtr,
504
              int16 *dPtr,
505
              uint32 rows,
506
              uint32 cols,
507
              uint32 planes,
508
              int32 sRowStep,
509
              int32 sColStep,
510
              int32 sPlaneStep,
511
              int32 dRowStep,
512
              int32 dColStep,
513
              int32 dPlaneStep)
514
0
  {
515
  
516
0
  for (uint32 row = 0; row < rows; row++)
517
0
    {
518
    
519
0
    const uint16 *sPtr1 = sPtr;
520
0
          int16  *dPtr1 = dPtr;
521
          
522
0
    for (uint32 col = 0; col < cols; col++)
523
0
      {
524
      
525
0
      const uint16 *sPtr2 = sPtr1;
526
0
            int16  *dPtr2 = dPtr1;
527
            
528
0
      for (uint32 plane = 0; plane < planes; plane++)
529
0
        {
530
      
531
0
        *dPtr2 = *sPtr2 ^ 0x8000;
532
        
533
0
        sPtr2 += sPlaneStep;
534
0
        dPtr2 += dPlaneStep;
535
        
536
0
        }
537
      
538
0
      sPtr1 += sColStep;
539
0
      dPtr1 += dColStep;
540
541
0
      }
542
      
543
0
    sPtr += sRowStep;
544
0
    dPtr += dRowStep;
545
    
546
0
    }
547
    
548
0
  }
549
550
/*****************************************************************************/
551
552
void RefCopyArea16_32 (const uint16 *sPtr,
553
             uint32 *dPtr,
554
             uint32 rows,
555
             uint32 cols,
556
             uint32 planes,
557
             int32 sRowStep,
558
             int32 sColStep,
559
             int32 sPlaneStep,
560
             int32 dRowStep,
561
             int32 dColStep,
562
             int32 dPlaneStep)
563
0
  {
564
  
565
0
  for (uint32 row = 0; row < rows; row++)
566
0
    {
567
    
568
0
    const uint16 *sPtr1 = sPtr;
569
0
          uint32 *dPtr1 = dPtr;
570
          
571
0
    for (uint32 col = 0; col < cols; col++)
572
0
      {
573
      
574
0
      const uint16 *sPtr2 = sPtr1;
575
0
            uint32 *dPtr2 = dPtr1;
576
            
577
0
      for (uint32 plane = 0; plane < planes; plane++)
578
0
        {
579
      
580
0
        *dPtr2 = *sPtr2;
581
        
582
0
        sPtr2 += sPlaneStep;
583
0
        dPtr2 += dPlaneStep;
584
        
585
0
        }
586
      
587
0
      sPtr1 += sColStep;
588
0
      dPtr1 += dColStep;
589
590
0
      }
591
      
592
0
    sPtr += sRowStep;
593
0
    dPtr += dRowStep;
594
    
595
0
    }
596
    
597
0
  }
598
599
/*****************************************************************************/
600
601
void RefCopyArea8_R32 (const uint8 *sPtr,
602
             real32 *dPtr,
603
             uint32 rows,
604
             uint32 cols,
605
             uint32 planes,
606
             int32 sRowStep,
607
             int32 sColStep,
608
             int32 sPlaneStep,
609
             int32 dRowStep,
610
             int32 dColStep,
611
             int32 dPlaneStep,
612
             uint32 pixelRange)
613
0
  {
614
  
615
0
  real32 scale = 1.0f / (real32) pixelRange;
616
  
617
0
  for (uint32 row = 0; row < rows; row++)
618
0
    {
619
    
620
0
    const uint8  *sPtr1 = sPtr;
621
0
          real32 *dPtr1 = dPtr;
622
          
623
0
    for (uint32 col = 0; col < cols; col++)
624
0
      {
625
      
626
0
      const uint8  *sPtr2 = sPtr1;
627
0
            real32 *dPtr2 = dPtr1;
628
            
629
0
      for (uint32 plane = 0; plane < planes; plane++)
630
0
        {
631
      
632
0
        *dPtr2 = scale * (real32) *sPtr2;
633
        
634
0
        sPtr2 += sPlaneStep;
635
0
        dPtr2 += dPlaneStep;
636
        
637
0
        }
638
      
639
0
      sPtr1 += sColStep;
640
0
      dPtr1 += dColStep;
641
642
0
      }
643
      
644
0
    sPtr += sRowStep;
645
0
    dPtr += dRowStep;
646
    
647
0
    }
648
    
649
0
  }
650
651
/*****************************************************************************/
652
653
void RefCopyArea16_R32 (const uint16 *sPtr,
654
              real32 *dPtr,
655
              uint32 rows,
656
              uint32 cols,
657
              uint32 planes,
658
              int32 sRowStep,
659
              int32 sColStep,
660
              int32 sPlaneStep,
661
              int32 dRowStep,
662
              int32 dColStep,
663
              int32 dPlaneStep,
664
            uint32 pixelRange)
665
313k
  {
666
  
667
313k
  real32 scale = 1.0f / (real32) pixelRange;
668
  
669
2.41M
  for (uint32 row = 0; row < rows; row++)
670
2.10M
    {
671
    
672
2.10M
    const uint16 *sPtr1 = sPtr;
673
2.10M
          real32 *dPtr1 = dPtr;
674
          
675
114M
    for (uint32 col = 0; col < cols; col++)
676
112M
      {
677
      
678
112M
      const uint16 *sPtr2 = sPtr1;
679
112M
            real32 *dPtr2 = dPtr1;
680
            
681
1.26G
      for (uint32 plane = 0; plane < planes; plane++)
682
1.15G
        {
683
      
684
1.15G
        *dPtr2 = scale * (real32) *sPtr2;
685
        
686
1.15G
        sPtr2 += sPlaneStep;
687
1.15G
        dPtr2 += dPlaneStep;
688
        
689
1.15G
        }
690
      
691
112M
      sPtr1 += sColStep;
692
112M
      dPtr1 += dColStep;
693
694
112M
      }
695
      
696
2.10M
    sPtr += sRowStep;
697
2.10M
    dPtr += dRowStep;
698
    
699
2.10M
    }
700
    
701
313k
  }
702
703
/*****************************************************************************/
704
705
void RefCopyAreaS16_R32 (const int16 *sPtr,
706
               real32 *dPtr,
707
               uint32 rows,
708
               uint32 cols,
709
               uint32 planes,
710
               int32 sRowStep,
711
               int32 sColStep,
712
               int32 sPlaneStep,
713
               int32 dRowStep,
714
               int32 dColStep,
715
               int32 dPlaneStep,
716
             uint32 pixelRange)
717
0
  {
718
  
719
0
  real32 scale = 1.0f / (real32) pixelRange;
720
  
721
0
  for (uint32 row = 0; row < rows; row++)
722
0
    {
723
    
724
0
    const int16  *sPtr1 = sPtr;
725
0
          real32 *dPtr1 = dPtr;
726
          
727
0
    for (uint32 col = 0; col < cols; col++)
728
0
      {
729
      
730
0
      const int16  *sPtr2 = sPtr1;
731
0
            real32 *dPtr2 = dPtr1;
732
            
733
0
      for (uint32 plane = 0; plane < planes; plane++)
734
0
        {
735
        
736
0
        int32 x = (*sPtr ^ 0x8000);
737
      
738
0
        *dPtr2 = scale * (real32) x;
739
        
740
0
        sPtr2 += sPlaneStep;
741
0
        dPtr2 += dPlaneStep;
742
        
743
0
        }
744
      
745
0
      sPtr1 += sColStep;
746
0
      dPtr1 += dColStep;
747
748
0
      }
749
      
750
0
    sPtr += sRowStep;
751
0
    dPtr += dRowStep;
752
    
753
0
    }
754
    
755
0
  }
756
757
/*****************************************************************************/
758
759
void RefCopyAreaR32_8 (const real32 *sPtr,
760
             uint8 *dPtr,
761
             uint32 rows,
762
             uint32 cols,
763
             uint32 planes,
764
             int32 sRowStep,
765
             int32 sColStep,
766
             int32 sPlaneStep,
767
             int32 dRowStep,
768
             int32 dColStep,
769
             int32 dPlaneStep,
770
             uint32 pixelRange)
771
520k
  {
772
  
773
520k
  real32 scale = (real32) pixelRange;
774
  
775
22.3M
  for (uint32 row = 0; row < rows; row++)
776
21.8M
    {
777
    
778
21.8M
    const real32 *sPtr1 = sPtr;
779
21.8M
          uint8  *dPtr1 = dPtr;
780
          
781
1.07G
    for (uint32 col = 0; col < cols; col++)
782
1.05G
      {
783
      
784
1.05G
      const real32 *sPtr2 = sPtr1;
785
1.05G
            uint8  *dPtr2 = dPtr1;
786
            
787
5.10G
      for (uint32 plane = 0; plane < planes; plane++)
788
4.04G
        {
789
        
790
4.04G
        *dPtr2 = (uint8) (Pin_Overrange (*sPtr2) * scale + 0.5f);
791
        
792
4.04G
        sPtr2 += sPlaneStep;
793
4.04G
        dPtr2 += dPlaneStep;
794
        
795
4.04G
        }
796
      
797
1.05G
      sPtr1 += sColStep;
798
1.05G
      dPtr1 += dColStep;
799
800
1.05G
      }
801
      
802
21.8M
    sPtr += sRowStep;
803
21.8M
    dPtr += dRowStep;
804
    
805
21.8M
    }
806
    
807
520k
  }
808
809
/*****************************************************************************/
810
811
void RefCopyAreaR32_16 (const real32 *sPtr,
812
              uint16 *dPtr,
813
              uint32 rows,
814
              uint32 cols,
815
              uint32 planes,
816
              int32 sRowStep,
817
              int32 sColStep,
818
              int32 sPlaneStep,
819
              int32 dRowStep,
820
              int32 dColStep,
821
              int32 dPlaneStep,
822
            uint32 pixelRange)
823
37.9k
  {
824
  
825
37.9k
  real32 scale = (real32) pixelRange;
826
  
827
1.10M
  for (uint32 row = 0; row < rows; row++)
828
1.06M
    {
829
    
830
1.06M
    const real32 *sPtr1 = sPtr;
831
1.06M
          uint16 *dPtr1 = dPtr;
832
          
833
71.6M
    for (uint32 col = 0; col < cols; col++)
834
70.5M
      {
835
      
836
70.5M
      const real32 *sPtr2 = sPtr1;
837
70.5M
            uint16 *dPtr2 = dPtr1;
838
            
839
320M
      for (uint32 plane = 0; plane < planes; plane++)
840
250M
        {
841
      
842
250M
        *dPtr2 = (uint16) (Pin_Overrange (*sPtr2) * scale + 0.5f);
843
        
844
250M
        sPtr2 += sPlaneStep;
845
250M
        dPtr2 += dPlaneStep;
846
        
847
250M
        }
848
      
849
70.5M
      sPtr1 += sColStep;
850
70.5M
      dPtr1 += dColStep;
851
852
70.5M
      }
853
      
854
1.06M
    sPtr += sRowStep;
855
1.06M
    dPtr += dRowStep;
856
    
857
1.06M
    }
858
    
859
37.9k
  }
860
861
/*****************************************************************************/
862
863
void RefCopyAreaR32_S16 (const real32 *sPtr,
864
               int16 *dPtr,
865
               uint32 rows,
866
               uint32 cols,
867
               uint32 planes,
868
               int32 sRowStep,
869
               int32 sColStep,
870
               int32 sPlaneStep,
871
               int32 dRowStep,
872
               int32 dColStep,
873
               int32 dPlaneStep,
874
             uint32 pixelRange)
875
0
  {
876
  
877
0
  real32 scale = (real32) pixelRange;
878
  
879
0
  for (uint32 row = 0; row < rows; row++)
880
0
    {
881
    
882
0
    const real32 *sPtr1 = sPtr;
883
0
        int16  *dPtr1 = dPtr;
884
          
885
0
    for (uint32 col = 0; col < cols; col++)
886
0
      {
887
      
888
0
      const real32 *sPtr2 = sPtr1;
889
0
            int16  *dPtr2 = dPtr1;
890
            
891
0
      for (uint32 plane = 0; plane < planes; plane++)
892
0
        {
893
        
894
0
        int32 x = (int32) (Pin_Overrange (*sPtr2) * scale + 0.5f);
895
      
896
0
        *dPtr2 = (int16) (x ^ 0x8000);
897
        
898
0
        sPtr2 += sPlaneStep;
899
0
        dPtr2 += dPlaneStep;
900
        
901
0
        }
902
      
903
0
      sPtr1 += sColStep;
904
0
      dPtr1 += dColStep;
905
906
0
      }
907
      
908
0
    sPtr += sRowStep;
909
0
    dPtr += dRowStep;
910
    
911
0
    }
912
    
913
0
  }
914
915
/*****************************************************************************/
916
917
void RefRepeatArea8 (const uint8 *sPtr,
918
           uint8 *dPtr,
919
           uint32 rows,
920
           uint32 cols,
921
           uint32 planes,
922
           int32 rowStep,
923
           int32 colStep,
924
           int32 planeStep,
925
           uint32 repeatV,
926
           uint32 repeatH,
927
           uint32 phaseV,
928
           uint32 phaseH)
929
0
  {
930
  
931
0
  const uint8 *sPtr0 = sPtr + phaseV * rowStep +
932
0
                phaseH * colStep;
933
                 
934
0
  int32 backStepV = (repeatV - 1) * rowStep;
935
0
  int32 backStepH = (repeatH - 1) * colStep;
936
  
937
0
  for (uint32 row = 0; row < rows; row++)
938
0
    {
939
    
940
0
    const uint8 *sPtr1 = sPtr0;
941
0
          uint8 *dPtr1 = dPtr;
942
          
943
0
    uint32 colPhase = phaseH;
944
          
945
0
    for (uint32 col = 0; col < cols; col++)
946
0
      {
947
      
948
0
      const uint8 *sPtr2 = sPtr1;
949
0
            uint8 *dPtr2 = dPtr1;
950
            
951
0
      for (uint32 plane = 0; plane < planes; plane++)
952
0
        {
953
        
954
0
        *dPtr2 = *sPtr2;
955
        
956
0
        sPtr2 += planeStep;
957
0
        dPtr2 += planeStep;
958
        
959
0
        }
960
        
961
0
      if (++colPhase == repeatH)
962
0
        {
963
0
        colPhase = 0;
964
0
        sPtr1 -= backStepH;
965
0
        }
966
0
      else
967
0
        {
968
0
        sPtr1 += colStep;
969
0
        }
970
        
971
0
      dPtr1 += colStep;
972
      
973
0
      }
974
      
975
0
    if (++phaseV == repeatV)
976
0
      {
977
0
      phaseV = 0;
978
0
      sPtr0 -= backStepV;
979
0
      }
980
0
    else
981
0
      {
982
0
      sPtr0 += rowStep;
983
0
      }
984
      
985
0
    dPtr += rowStep;
986
            
987
0
    }
988
  
989
0
  }
990
                
991
/*****************************************************************************/
992
993
void RefRepeatArea16 (const uint16 *sPtr,
994
            uint16 *dPtr,
995
            uint32 rows,
996
            uint32 cols,
997
            uint32 planes,
998
            int32 rowStep,
999
            int32 colStep,
1000
            int32 planeStep,
1001
            uint32 repeatV,
1002
            uint32 repeatH,
1003
            uint32 phaseV,
1004
            uint32 phaseH)
1005
1.08M
  {
1006
  
1007
1.08M
  const uint16 *sPtr0 = sPtr + phaseV * rowStep +
1008
1.08M
                 phaseH * colStep;
1009
                 
1010
1.08M
  int32 backStepV = (repeatV - 1) * rowStep;
1011
1.08M
  int32 backStepH = (repeatH - 1) * colStep;
1012
  
1013
55.8M
  for (uint32 row = 0; row < rows; row++)
1014
54.7M
    {
1015
    
1016
54.7M
    const uint16 *sPtr1 = sPtr0;
1017
54.7M
          uint16 *dPtr1 = dPtr;
1018
          
1019
54.7M
    uint32 colPhase = phaseH;
1020
          
1021
2.86G
    for (uint32 col = 0; col < cols; col++)
1022
2.81G
      {
1023
      
1024
2.81G
      const uint16 *sPtr2 = sPtr1;
1025
2.81G
            uint16 *dPtr2 = dPtr1;
1026
            
1027
6.01G
      for (uint32 plane = 0; plane < planes; plane++)
1028
3.20G
        {
1029
        
1030
3.20G
        *dPtr2 = *sPtr2;
1031
        
1032
3.20G
        sPtr2 += planeStep;
1033
3.20G
        dPtr2 += planeStep;
1034
        
1035
3.20G
        }
1036
        
1037
2.81G
      if (++colPhase == repeatH)
1038
1.60G
        {
1039
1.60G
        colPhase = 0;
1040
1.60G
        sPtr1 -= backStepH;
1041
1.60G
        }
1042
1.20G
      else
1043
1.20G
        {
1044
1.20G
        sPtr1 += colStep;
1045
1.20G
        }
1046
        
1047
2.81G
      dPtr1 += colStep;
1048
      
1049
2.81G
      }
1050
      
1051
54.7M
    if (++phaseV == repeatV)
1052
35.1M
      {
1053
35.1M
      phaseV = 0;
1054
35.1M
      sPtr0 -= backStepV;
1055
35.1M
      }
1056
19.6M
    else
1057
19.6M
      {
1058
19.6M
      sPtr0 += rowStep;
1059
19.6M
      }
1060
      
1061
54.7M
    dPtr += rowStep;
1062
            
1063
54.7M
    }
1064
  
1065
1.08M
  }
1066
                
1067
/*****************************************************************************/
1068
1069
void RefRepeatArea32 (const uint32 *sPtr,
1070
            uint32 *dPtr,
1071
            uint32 rows,
1072
            uint32 cols,
1073
            uint32 planes,
1074
            int32 rowStep,
1075
            int32 colStep,
1076
            int32 planeStep,
1077
            uint32 repeatV,
1078
            uint32 repeatH,
1079
            uint32 phaseV,
1080
            uint32 phaseH)
1081
838k
  {
1082
  
1083
838k
  const uint32 *sPtr0 = sPtr + phaseV * rowStep +
1084
838k
                 phaseH * colStep;
1085
                 
1086
838k
  int32 backStepV = (repeatV - 1) * rowStep;
1087
838k
  int32 backStepH = (repeatH - 1) * colStep;
1088
  
1089
33.9M
  for (uint32 row = 0; row < rows; row++)
1090
33.0M
    {
1091
    
1092
33.0M
    const uint32 *sPtr1 = sPtr0;
1093
33.0M
          uint32 *dPtr1 = dPtr;
1094
          
1095
33.0M
    uint32 colPhase = phaseH;
1096
          
1097
1.19G
    for (uint32 col = 0; col < cols; col++)
1098
1.16G
      {
1099
      
1100
1.16G
      const uint32 *sPtr2 = sPtr1;
1101
1.16G
            uint32 *dPtr2 = dPtr1;
1102
            
1103
2.52G
      for (uint32 plane = 0; plane < planes; plane++)
1104
1.36G
        {
1105
        
1106
1.36G
        *dPtr2 = *sPtr2;
1107
        
1108
1.36G
        sPtr2 += planeStep;
1109
1.36G
        dPtr2 += planeStep;
1110
        
1111
1.36G
        }
1112
        
1113
1.16G
      if (++colPhase == repeatH)
1114
843M
        {
1115
843M
        colPhase = 0;
1116
843M
        sPtr1 -= backStepH;
1117
843M
        }
1118
319M
      else
1119
319M
        {
1120
319M
        sPtr1 += colStep;
1121
319M
        }
1122
        
1123
1.16G
      dPtr1 += colStep;
1124
      
1125
1.16G
      }
1126
      
1127
33.0M
    if (++phaseV == repeatV)
1128
13.1M
      {
1129
13.1M
      phaseV = 0;
1130
13.1M
      sPtr0 -= backStepV;
1131
13.1M
      }
1132
19.9M
    else
1133
19.9M
      {
1134
19.9M
      sPtr0 += rowStep;
1135
19.9M
      }
1136
      
1137
33.0M
    dPtr += rowStep;
1138
            
1139
33.0M
    }
1140
  
1141
838k
  }
1142
                
1143
/*****************************************************************************/
1144
1145
void RefShiftRight16 (uint16 *dPtr,
1146
            uint32 rows,
1147
            uint32 cols,
1148
            uint32 planes,
1149
            int32 rowStep,
1150
            int32 colStep,
1151
            int32 planeStep,
1152
            uint32 shift)
1153
0
  {
1154
  
1155
0
  for (uint32 row = 0; row < rows; row++)
1156
0
    {
1157
    
1158
0
    uint16 *dPtr1 = dPtr;
1159
          
1160
0
    for (uint32 col = 0; col < cols; col++)
1161
0
      {
1162
      
1163
0
      uint16 *dPtr2 = dPtr1;
1164
            
1165
0
      for (uint32 plane = 0; plane < planes; plane++)
1166
0
        {
1167
      
1168
0
        *dPtr2 >>= shift;
1169
        
1170
0
        dPtr2 += planeStep;
1171
        
1172
0
        }
1173
      
1174
0
      dPtr1 += colStep;
1175
1176
0
      }
1177
      
1178
0
    dPtr += rowStep;
1179
    
1180
0
    }
1181
      
1182
0
  }
1183
1184
/*****************************************************************************/
1185
1186
void RefBilinearRow16 (const uint16 *sPtr,
1187
             uint16 *dPtr,
1188
             uint32 cols,
1189
             uint32 patPhase,
1190
             uint32 patCount,
1191
             const uint32 * kernCounts,
1192
             const int32  * const * kernOffsets,
1193
             const uint16 * const * kernWeights,
1194
             uint32 sShift)
1195
1.81M
  {
1196
  
1197
77.4M
  for (uint32 j = 0; j < cols; j++)
1198
75.5M
    {
1199
    
1200
75.5M
    const uint16 *p = sPtr + (j >> sShift);
1201
    
1202
75.5M
    uint32 count = kernCounts [patPhase];
1203
    
1204
75.5M
    const int32  *offsets = kernOffsets [patPhase];
1205
75.5M
    const uint16 *weights = kernWeights [patPhase];
1206
    
1207
75.5M
    if (++patPhase == patCount)
1208
35.2M
      {
1209
35.2M
      patPhase = 0;
1210
35.2M
      }
1211
      
1212
75.5M
    uint32 total = 128;
1213
    
1214
244M
    for (uint32 k = 0; k < count; k++)
1215
169M
      {
1216
      
1217
169M
      int32  offset = offsets [k];
1218
169M
      uint32 weight = weights [k];
1219
      
1220
169M
      uint32 pixel = p [offset];
1221
      
1222
169M
      total += pixel * weight;
1223
            
1224
169M
      }
1225
      
1226
75.5M
    dPtr [j] = (uint16) (total >> 8);
1227
    
1228
75.5M
    }
1229
        
1230
1.81M
  }
1231
1232
/*****************************************************************************/
1233
1234
void RefBilinearRow32 (const real32 *sPtr,
1235
             real32 *dPtr,
1236
             uint32 cols,
1237
             uint32 patPhase,
1238
             uint32 patCount,
1239
             const uint32 * kernCounts,
1240
             const int32  * const * kernOffsets,
1241
             const real32 * const * kernWeights,
1242
             uint32 sShift)
1243
1.89M
  {
1244
  
1245
65.7M
  for (uint32 j = 0; j < cols; j++)
1246
63.8M
    {
1247
    
1248
63.8M
    const real32 *p = sPtr + (j >> sShift);
1249
    
1250
63.8M
    uint32 count = kernCounts [patPhase];
1251
    
1252
63.8M
    const int32  *offsets = kernOffsets [patPhase];
1253
63.8M
    const real32 *weights = kernWeights [patPhase];
1254
    
1255
63.8M
    if (++patPhase == patCount)
1256
31.0M
      {
1257
31.0M
      patPhase = 0;
1258
31.0M
      }
1259
      
1260
63.8M
    real32 total = 0.0f;
1261
    
1262
210M
    for (uint32 k = 0; k < count; k++)
1263
146M
      {
1264
      
1265
146M
      int32  offset = offsets [k];
1266
146M
      real32 weight = weights [k];
1267
      
1268
146M
      real32 pixel = p [offset];
1269
      
1270
146M
      total += pixel * weight;
1271
            
1272
146M
      }
1273
      
1274
63.8M
    dPtr [j] = total;
1275
    
1276
63.8M
    }
1277
        
1278
1.89M
  }
1279
1280
/*****************************************************************************/
1281
1282
void RefBaselineABCtoRGB (const real32 *sPtrA,
1283
              const real32 *sPtrB,
1284
              const real32 *sPtrC,
1285
              real32 *dPtrR,
1286
              real32 *dPtrG,
1287
              real32 *dPtrB,
1288
              uint32 count,
1289
              const dng_vector &cameraWhite,
1290
              const dng_matrix &cameraToRGB)
1291
962k
  {
1292
  
1293
962k
  real32 clipA = (real32) cameraWhite [0];
1294
962k
  real32 clipB = (real32) cameraWhite [1];
1295
962k
  real32 clipC = (real32) cameraWhite [2];
1296
  
1297
962k
  real32 m00 = (real32) cameraToRGB [0] [0];
1298
962k
  real32 m01 = (real32) cameraToRGB [0] [1];
1299
962k
  real32 m02 = (real32) cameraToRGB [0] [2];
1300
  
1301
962k
  real32 m10 = (real32) cameraToRGB [1] [0];
1302
962k
  real32 m11 = (real32) cameraToRGB [1] [1];
1303
962k
  real32 m12 = (real32) cameraToRGB [1] [2];
1304
  
1305
962k
  real32 m20 = (real32) cameraToRGB [2] [0];
1306
962k
  real32 m21 = (real32) cameraToRGB [2] [1];
1307
962k
  real32 m22 = (real32) cameraToRGB [2] [2];
1308
  
1309
72.4M
  for (uint32 col = 0; col < count; col++)
1310
71.4M
    {
1311
    
1312
71.4M
    real32 A = sPtrA [col];
1313
71.4M
    real32 B = sPtrB [col];
1314
71.4M
    real32 C = sPtrC [col];
1315
    
1316
71.4M
    A = Min_real32 (A, clipA);
1317
71.4M
    B = Min_real32 (B, clipB);
1318
71.4M
    C = Min_real32 (C, clipC);
1319
    
1320
71.4M
    real32 r = m00 * A + m01 * B + m02 * C;
1321
71.4M
    real32 g = m10 * A + m11 * B + m12 * C;
1322
71.4M
    real32 b = m20 * A + m21 * B + m22 * C;
1323
    
1324
71.4M
    r = Pin_real32 (0.0f, r, 1.0f);
1325
71.4M
    g = Pin_real32 (0.0f, g, 1.0f);
1326
71.4M
    b = Pin_real32 (0.0f, b, 1.0f);
1327
    
1328
71.4M
    dPtrR [col] = r;
1329
71.4M
    dPtrG [col] = g;
1330
71.4M
    dPtrB [col] = b;
1331
    
1332
71.4M
    }
1333
  
1334
962k
  }
1335
1336
/*****************************************************************************/
1337
1338
void RefBaselineABCDtoRGB (const real32 *sPtrA,
1339
               const real32 *sPtrB,
1340
               const real32 *sPtrC,
1341
               const real32 *sPtrD,
1342
               real32 *dPtrR,
1343
               real32 *dPtrG,
1344
               real32 *dPtrB,
1345
               uint32 count,
1346
               const dng_vector &cameraWhite,
1347
               const dng_matrix &cameraToRGB)
1348
387k
  {
1349
  
1350
387k
  real32 clipA = (real32) cameraWhite [0];
1351
387k
  real32 clipB = (real32) cameraWhite [1];
1352
387k
  real32 clipC = (real32) cameraWhite [2];
1353
387k
  real32 clipD = (real32) cameraWhite [3];
1354
  
1355
387k
  real32 m00 = (real32) cameraToRGB [0] [0];
1356
387k
  real32 m01 = (real32) cameraToRGB [0] [1];
1357
387k
  real32 m02 = (real32) cameraToRGB [0] [2];
1358
387k
  real32 m03 = (real32) cameraToRGB [0] [3];
1359
  
1360
387k
  real32 m10 = (real32) cameraToRGB [1] [0];
1361
387k
  real32 m11 = (real32) cameraToRGB [1] [1];
1362
387k
  real32 m12 = (real32) cameraToRGB [1] [2];
1363
387k
  real32 m13 = (real32) cameraToRGB [1] [3];
1364
  
1365
387k
  real32 m20 = (real32) cameraToRGB [2] [0];
1366
387k
  real32 m21 = (real32) cameraToRGB [2] [1];
1367
387k
  real32 m22 = (real32) cameraToRGB [2] [2];
1368
387k
  real32 m23 = (real32) cameraToRGB [2] [3];
1369
  
1370
26.2M
  for (uint32 col = 0; col < count; col++)
1371
25.8M
    {
1372
    
1373
25.8M
    real32 A = sPtrA [col];
1374
25.8M
    real32 B = sPtrB [col];
1375
25.8M
    real32 C = sPtrC [col];
1376
25.8M
    real32 D = sPtrD [col];
1377
    
1378
25.8M
    A = Min_real32 (A, clipA);
1379
25.8M
    B = Min_real32 (B, clipB);
1380
25.8M
    C = Min_real32 (C, clipC);
1381
25.8M
    D = Min_real32 (D, clipD);
1382
    
1383
25.8M
    real32 r = m00 * A + m01 * B + m02 * C + m03 * D;
1384
25.8M
    real32 g = m10 * A + m11 * B + m12 * C + m13 * D;
1385
25.8M
    real32 b = m20 * A + m21 * B + m22 * C + m23 * D;
1386
    
1387
25.8M
    r = Pin_real32 (0.0f, r, 1.0f);
1388
25.8M
    g = Pin_real32 (0.0f, g, 1.0f);
1389
25.8M
    b = Pin_real32 (0.0f, b, 1.0f);
1390
    
1391
25.8M
    dPtrR [col] = r;
1392
25.8M
    dPtrG [col] = g;
1393
25.8M
    dPtrB [col] = b;
1394
    
1395
25.8M
    }
1396
  
1397
387k
  }
1398
1399
/*****************************************************************************/
1400
1401
void RefBaselineHueSatMap (const real32 *sPtrR,
1402
               const real32 *sPtrG,
1403
               const real32 *sPtrB,
1404
               real32 *dPtrR,
1405
               real32 *dPtrG,
1406
               real32 *dPtrB,
1407
               uint32 count,
1408
               const dng_hue_sat_map &lut,
1409
               const dng_1d_table *encodeTable,
1410
               const dng_1d_table *decodeTable)
1411
0
  {
1412
  
1413
0
  uint32 hueDivisions;
1414
0
  uint32 satDivisions;
1415
0
  uint32 valDivisions;
1416
  
1417
0
  lut.GetDivisions (hueDivisions,
1418
0
            satDivisions,
1419
0
            valDivisions);
1420
            
1421
0
  real32 hScale = (hueDivisions < 2) ? 0.0f : (hueDivisions * (1.0f / 6.0f));
1422
0
  real32 sScale = (real32) ((int32) satDivisions - 1);
1423
0
  real32 vScale = (real32) ((int32) valDivisions - 1);
1424
    
1425
0
  int32 maxHueIndex0 = (int32) hueDivisions - 1;
1426
0
  int32 maxSatIndex0 = (int32) satDivisions - 2;
1427
0
  int32 maxValIndex0 = (int32) valDivisions - 2;
1428
1429
0
  const bool hasEncodeTable = ((encodeTable != NULL) && (encodeTable->Table () != NULL));
1430
0
  const bool hasDecodeTable = ((decodeTable != NULL) && (decodeTable->Table () != NULL));
1431
1432
0
  const bool hasTable = hasEncodeTable && hasDecodeTable;
1433
1434
0
  const dng_hue_sat_map::HSBModify *tableBase = lut.GetConstDeltas ();
1435
  
1436
0
  int32 hueStep = satDivisions;
1437
0
  int32 valStep = hueDivisions * hueStep;
1438
  
1439
  #if 0 // Not required with "2.5D" table optimization.
1440
  
1441
  if (valDivisions < 2)
1442
    {
1443
    valStep      = 0;
1444
    maxValIndex0 = 0;
1445
    }
1446
    
1447
  #endif
1448
  
1449
0
  for (uint32 j = 0; j < count; j++)
1450
0
    {
1451
    
1452
0
    real32 r = sPtrR [j];
1453
0
    real32 g = sPtrG [j];
1454
0
    real32 b = sPtrB [j];
1455
    
1456
0
    real32 h, s, v;
1457
1458
0
    DNG_RGBtoHSV (r, g, b, h, s, v);
1459
1460
0
    real32 vEncoded = v;
1461
1462
0
    real32 hueShift;
1463
0
    real32 satScale;
1464
0
    real32 valScale;
1465
    
1466
0
    if (valDivisions < 2)   // Optimize most common case of "2.5D" table.
1467
0
      {
1468
    
1469
0
      real32 hScaled = h * hScale;
1470
0
      real32 sScaled = s * sScale;
1471
      
1472
0
      int32 hIndex0 = (int32) hScaled;
1473
0
      int32 sIndex0 = (int32) sScaled;
1474
      
1475
0
      sIndex0 = Min_int32 (sIndex0, maxSatIndex0);
1476
      
1477
0
      int32 hIndex1 = hIndex0 + 1;
1478
      
1479
0
      if (hIndex0 >= maxHueIndex0)
1480
0
        {
1481
0
        hIndex0 = maxHueIndex0;
1482
0
        hIndex1 = 0;
1483
0
        }
1484
        
1485
0
      real32 hFract1 = hScaled - (real32) hIndex0;
1486
0
      real32 sFract1 = sScaled - (real32) sIndex0;
1487
      
1488
0
      real32 hFract0 = 1.0f - hFract1;
1489
0
      real32 sFract0 = 1.0f - sFract1;
1490
      
1491
0
      const dng_hue_sat_map::HSBModify *entry00 = tableBase + hIndex0 * hueStep +
1492
0
                                  sIndex0;
1493
      
1494
0
      const dng_hue_sat_map::HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * hueStep;
1495
      
1496
0
      real32 hueShift0 = hFract0 * entry00->fHueShift +
1497
0
                 hFract1 * entry01->fHueShift;
1498
                     
1499
0
      real32 satScale0 = hFract0 * entry00->fSatScale +
1500
0
                 hFract1 * entry01->fSatScale;
1501
      
1502
0
      real32 valScale0 = hFract0 * entry00->fValScale +
1503
0
                 hFract1 * entry01->fValScale;
1504
1505
0
      entry00++;
1506
0
      entry01++;
1507
1508
0
      real32 hueShift1 = hFract0 * entry00->fHueShift +
1509
0
                 hFract1 * entry01->fHueShift;
1510
                     
1511
0
      real32 satScale1 = hFract0 * entry00->fSatScale +
1512
0
                 hFract1 * entry01->fSatScale;
1513
      
1514
0
      real32 valScale1 = hFract0 * entry00->fValScale +
1515
0
                 hFract1 * entry01->fValScale;
1516
            
1517
0
      hueShift = sFract0 * hueShift0 + sFract1 * hueShift1;
1518
0
      satScale = sFract0 * satScale0 + sFract1 * satScale1;
1519
0
      valScale = sFract0 * valScale0 + sFract1 * valScale1;
1520
      
1521
0
      }
1522
      
1523
0
    else
1524
0
      {
1525
    
1526
0
      if (hasTable)
1527
0
        {
1528
0
        vEncoded = encodeTable->Interpolate (Pin_real32 (v));
1529
0
        }
1530
1531
0
      real32 hScaled = h      * hScale;
1532
0
      real32 sScaled = s      * sScale;
1533
0
      real32 vScaled = vEncoded * vScale;
1534
      
1535
0
      int32 hIndex0 = (int32) hScaled;
1536
0
      int32 sIndex0 = (int32) sScaled;
1537
0
      int32 vIndex0 = (int32) vScaled;
1538
      
1539
0
      sIndex0 = Min_int32 (sIndex0, maxSatIndex0);
1540
0
      vIndex0 = Min_int32 (vIndex0, maxValIndex0);
1541
      
1542
0
      int32 hIndex1 = hIndex0 + 1;
1543
      
1544
0
      if (hIndex0 >= maxHueIndex0)
1545
0
        {
1546
0
        hIndex0 = maxHueIndex0;
1547
0
        hIndex1 = 0;
1548
0
        }
1549
        
1550
0
      real32 hFract1 = hScaled - (real32) hIndex0;
1551
0
      real32 sFract1 = sScaled - (real32) sIndex0;
1552
0
      real32 vFract1 = vScaled - (real32) vIndex0;
1553
      
1554
0
      real32 hFract0 = 1.0f - hFract1;
1555
0
      real32 sFract0 = 1.0f - sFract1;
1556
0
      real32 vFract0 = 1.0f - vFract1;
1557
      
1558
0
      const dng_hue_sat_map::HSBModify *entry00 = tableBase + vIndex0 * valStep + 
1559
0
                                  hIndex0 * hueStep +
1560
0
                                  sIndex0;
1561
      
1562
0
      const dng_hue_sat_map::HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * hueStep;
1563
      
1564
0
      const dng_hue_sat_map::HSBModify *entry10 = entry00 + valStep;
1565
0
      const dng_hue_sat_map::HSBModify *entry11 = entry01 + valStep;
1566
      
1567
0
      real32 hueShift0 = vFract0 * (hFract0 * entry00->fHueShift +
1568
0
                        hFract1 * entry01->fHueShift) +
1569
0
                 vFract1 * (hFract0 * entry10->fHueShift +
1570
0
                        hFract1 * entry11->fHueShift);
1571
                     
1572
0
      real32 satScale0 = vFract0 * (hFract0 * entry00->fSatScale +
1573
0
                        hFract1 * entry01->fSatScale) +
1574
0
                 vFract1 * (hFract0 * entry10->fSatScale +
1575
0
                        hFract1 * entry11->fSatScale);
1576
      
1577
0
      real32 valScale0 = vFract0 * (hFract0 * entry00->fValScale +
1578
0
                        hFract1 * entry01->fValScale) +
1579
0
                 vFract1 * (hFract0 * entry10->fValScale +
1580
0
                        hFract1 * entry11->fValScale);
1581
      
1582
0
      entry00++;
1583
0
      entry01++;
1584
0
      entry10++;
1585
0
      entry11++;
1586
1587
0
      real32 hueShift1 = vFract0 * (hFract0 * entry00->fHueShift +
1588
0
                      hFract1 * entry01->fHueShift) +
1589
0
                 vFract1 * (hFract0 * entry10->fHueShift +
1590
0
                      hFract1 * entry11->fHueShift);
1591
                     
1592
0
      real32 satScale1 = vFract0 * (hFract0 * entry00->fSatScale +
1593
0
                      hFract1 * entry01->fSatScale) +
1594
0
                 vFract1 * (hFract0 * entry10->fSatScale +
1595
0
                      hFract1 * entry11->fSatScale);
1596
      
1597
0
      real32 valScale1 = vFract0 * (hFract0 * entry00->fValScale +
1598
0
                      hFract1 * entry01->fValScale) +
1599
0
                 vFract1 * (hFract0 * entry10->fValScale +
1600
0
                      hFract1 * entry11->fValScale);
1601
            
1602
0
      hueShift = sFract0 * hueShift0 + sFract1 * hueShift1;
1603
0
      satScale = sFract0 * satScale0 + sFract1 * satScale1;
1604
0
      valScale = sFract0 * valScale0 + sFract1 * valScale1;
1605
      
1606
0
      }
1607
      
1608
0
    hueShift *= (6.0f / 360.0f);  // Convert to internal hue range.
1609
    
1610
0
    h += hueShift;
1611
    
1612
0
    s = Min_real32 (s * satScale, 1.0f);
1613
1614
0
    vEncoded = Pin_real32 (vEncoded * valScale);
1615
1616
0
    v = hasTable ? decodeTable->Interpolate (vEncoded) : vEncoded;
1617
    
1618
0
    DNG_HSVtoRGB (h, s, v, r, g, b);
1619
1620
0
    dPtrR [j] = r;
1621
0
    dPtrG [j] = g;
1622
0
    dPtrB [j] = b;
1623
    
1624
0
    }
1625
  
1626
0
  }
1627
1628
/*****************************************************************************/
1629
1630
void RefBaselineRGBtoGray (const real32 *sPtrR,
1631
               const real32 *sPtrG,
1632
               const real32 *sPtrB,
1633
               real32 *dPtrG,
1634
               uint32 count,
1635
               const dng_matrix &matrix)
1636
6.97M
  {
1637
  
1638
6.97M
  real32 m00 = (real32) matrix [0] [0];
1639
6.97M
  real32 m01 = (real32) matrix [0] [1];
1640
6.97M
  real32 m02 = (real32) matrix [0] [2];
1641
  
1642
250M
  for (uint32 col = 0; col < count; col++)
1643
243M
    {
1644
    
1645
243M
    real32 R = sPtrR [col];
1646
243M
    real32 G = sPtrG [col];
1647
243M
    real32 B = sPtrB [col];
1648
    
1649
243M
    real32 g = m00 * R + m01 * G + m02 * B;
1650
    
1651
243M
    g = Pin_real32 (0.0f, g, 1.0f);
1652
    
1653
243M
    dPtrG [col] = g;
1654
    
1655
243M
    }
1656
  
1657
6.97M
  }
1658
1659
/*****************************************************************************/
1660
1661
void RefBaselineRGBtoRGB (const real32 *sPtrR,
1662
              const real32 *sPtrG,
1663
              const real32 *sPtrB,
1664
              real32 *dPtrR,
1665
              real32 *dPtrG,
1666
              real32 *dPtrB,
1667
              uint32 count,
1668
              const dng_matrix &matrix)
1669
27.6M
  {
1670
  
1671
27.6M
  real32 m00 = (real32) matrix [0] [0];
1672
27.6M
  real32 m01 = (real32) matrix [0] [1];
1673
27.6M
  real32 m02 = (real32) matrix [0] [2];
1674
  
1675
27.6M
  real32 m10 = (real32) matrix [1] [0];
1676
27.6M
  real32 m11 = (real32) matrix [1] [1];
1677
27.6M
  real32 m12 = (real32) matrix [1] [2];
1678
  
1679
27.6M
  real32 m20 = (real32) matrix [2] [0];
1680
27.6M
  real32 m21 = (real32) matrix [2] [1];
1681
27.6M
  real32 m22 = (real32) matrix [2] [2];
1682
  
1683
1.29G
  for (uint32 col = 0; col < count; col++)
1684
1.26G
    {
1685
    
1686
1.26G
    real32 R = sPtrR [col];
1687
1.26G
    real32 G = sPtrG [col];
1688
1.26G
    real32 B = sPtrB [col];
1689
    
1690
1.26G
    real32 r = m00 * R + m01 * G + m02 * B;
1691
1.26G
    real32 g = m10 * R + m11 * G + m12 * B;
1692
1.26G
    real32 b = m20 * R + m21 * G + m22 * B;
1693
    
1694
1.26G
    r = Pin_real32 (0.0f, r, 1.0f);
1695
1.26G
    g = Pin_real32 (0.0f, g, 1.0f);
1696
1.26G
    b = Pin_real32 (0.0f, b, 1.0f);
1697
    
1698
1.26G
    dPtrR [col] = r;
1699
1.26G
    dPtrG [col] = g;
1700
1.26G
    dPtrB [col] = b;
1701
    
1702
1.26G
    }
1703
  
1704
27.6M
  }
1705
1706
/*****************************************************************************/
1707
1708
void RefBaseline1DTable (const real32 *sPtr,
1709
             real32 *dPtr,
1710
             uint32 count,
1711
             const dng_1d_table &table)
1712
193M
  {
1713
1714
8.77G
  for (uint32 col = 0; col < count; col++)
1715
8.57G
    {
1716
    
1717
8.57G
    real32 x = sPtr [col];
1718
    
1719
8.57G
    real32 y = table.Interpolate (x);
1720
    
1721
8.57G
    dPtr [col] = y;
1722
    
1723
8.57G
    }
1724
  
1725
193M
  }
1726
1727
/*****************************************************************************/
1728
1729
void RefBaselineRGBTone (const real32 *sPtrR,
1730
             const real32 *sPtrG,
1731
             const real32 *sPtrB,
1732
             real32 *dPtrR,
1733
             real32 *dPtrG,
1734
             real32 *dPtrB,
1735
             uint32 count,
1736
             const dng_1d_table &table)
1737
34.6M
  {
1738
1739
1.54G
  for (uint32 col = 0; col < count; col++)
1740
1.51G
    {
1741
    
1742
1.51G
    real32 r = sPtrR [col];
1743
1.51G
    real32 g = sPtrG [col];
1744
1.51G
    real32 b = sPtrB [col];
1745
    
1746
1.51G
    real32 rr;
1747
1.51G
    real32 gg;
1748
1.51G
    real32 bb;
1749
    
1750
1.51G
    #define RGBTone(r, g, b, rr, gg, bb)\
1751
1.51G
      {\
1752
78.8M
      \
1753
78.8M
      DNG_ASSERT (r >= g && g >= b && r > b, "Logic Error RGBTone");\
1754
78.8M
      \
1755
78.8M
      rr = table.Interpolate (r);\
1756
78.8M
      bb = table.Interpolate (b);\
1757
78.8M
      \
1758
78.8M
      gg = bb + ((rr - bb) * (g - b) / (r - b));\
1759
78.8M
      \
1760
78.8M
      }
1761
    
1762
1.51G
    if (r >= g)
1763
1.47G
      {
1764
      
1765
1.47G
      if (g > b)
1766
5.58M
        {
1767
        
1768
        // Case 1: r >= g > b
1769
        
1770
5.58M
        RGBTone (r, g, b, rr, gg, bb);
1771
        
1772
5.58M
        }
1773
          
1774
1.47G
      else if (b > r)
1775
4.05M
        {
1776
        
1777
        // Case 2: b > r >= g
1778
        
1779
4.05M
        RGBTone (b, r, g, bb, rr, gg);
1780
                
1781
4.05M
        }
1782
        
1783
1.46G
      else if (b > g)
1784
34.6M
        {
1785
        
1786
        // Case 3: r >= b > g
1787
        
1788
34.6M
        RGBTone (r, b, g, rr, bb, gg);
1789
        
1790
34.6M
        }
1791
        
1792
1.43G
      else
1793
1.43G
        {
1794
        
1795
        // Case 4: r >= g == b
1796
        
1797
1.43G
        DNG_ASSERT (r >= g && g == b, "Logic Error 2");
1798
        
1799
1.43G
        rr = table.Interpolate (r);
1800
1.43G
        gg = table.Interpolate (g);
1801
1.43G
        bb = gg;
1802
        
1803
1.43G
        }
1804
        
1805
1.47G
      }
1806
      
1807
34.5M
    else
1808
34.5M
      {
1809
      
1810
34.5M
      if (r >= b)
1811
4.75M
        {
1812
        
1813
        // Case 5: g > r >= b
1814
        
1815
4.75M
        RGBTone (g, r, b, gg, rr, bb);
1816
        
1817
4.75M
        }
1818
        
1819
29.7M
      else if (b > g)
1820
12.3M
        {
1821
        
1822
        // Case 6: b > g > r
1823
        
1824
12.3M
        RGBTone (b, g, r, bb, gg, rr);
1825
        
1826
12.3M
        }
1827
        
1828
17.4M
      else
1829
17.4M
        {
1830
        
1831
        // Case 7: g >= b > r
1832
        
1833
17.4M
        RGBTone (g, b, r, gg, bb, rr);
1834
        
1835
17.4M
        }
1836
      
1837
34.5M
      }
1838
      
1839
1.51G
    #undef RGBTone
1840
    
1841
1.51G
    dPtrR [col] = rr;
1842
1.51G
    dPtrG [col] = gg;
1843
1.51G
    dPtrB [col] = bb;
1844
    
1845
1.51G
    }
1846
  
1847
34.6M
  }
1848
1849
/*****************************************************************************/
1850
1851
void RefResampleDown16 (const uint16 *sPtr,
1852
            uint16 *dPtr,
1853
            uint32 sCount,
1854
            int32 sRowStep,
1855
            const int16 *wPtr,
1856
            uint32 wCount,
1857
            uint32 pixelRange)
1858
20.2M
  {
1859
  
1860
1.38G
  for (uint32 j = 0; j < sCount; j++)
1861
1.36G
    {
1862
    
1863
1.36G
    int32 total = 8192;
1864
    
1865
1.36G
    const uint16 *s = sPtr + j;
1866
    
1867
23.7G
    for (uint32 k = 0; k < wCount; k++)
1868
22.4G
      {
1869
      
1870
22.4G
      total += wPtr [k] * (int32) s [0];
1871
        
1872
22.4G
      s += sRowStep;
1873
        
1874
22.4G
      }
1875
      
1876
1.36G
    dPtr [j] = (uint16) Pin_int32 (0,
1877
1.36G
                     total >> 14,
1878
1.36G
                     pixelRange);
1879
1880
1.36G
    }
1881
    
1882
20.2M
  }
1883
1884
/*****************************************************************************/
1885
1886
void RefResampleDown32 (const real32 *sPtr,
1887
            real32 *dPtr,
1888
            uint32 sCount,
1889
            int32 sRowStep,
1890
            const real32 *wPtr,
1891
            uint32 wCount)
1892
13.7M
  {
1893
  
1894
13.7M
  uint32 col;
1895
  
1896
  // Process first row.
1897
  
1898
13.7M
  real32 w = wPtr [0];
1899
                           
1900
1.75G
  for (col = 0; col < sCount; col++)
1901
1.74G
    {
1902
    
1903
1.74G
    dPtr [col] = w * sPtr [col];
1904
    
1905
1.74G
    }
1906
    
1907
13.7M
  sPtr += sRowStep;
1908
  
1909
  // Process middle rows.
1910
  
1911
82.9M
  for (uint32 j = 1; j < wCount - 1; j++)
1912
69.1M
    {
1913
    
1914
69.1M
    w = wPtr [j];
1915
                           
1916
9.50G
    for (col = 0; col < sCount; col++)
1917
9.43G
      {
1918
      
1919
9.43G
      dPtr [col] += w * sPtr [col];
1920
      
1921
9.43G
      }
1922
      
1923
69.1M
    sPtr += sRowStep;
1924
    
1925
69.1M
    }
1926
    
1927
  // Process last row.
1928
  
1929
13.7M
  w = wPtr [wCount - 1];
1930
  
1931
1.75G
  for (col = 0; col < sCount; col++)
1932
1.74G
    {
1933
    
1934
1.74G
    dPtr [col] = Pin_real32 (0.0f, 
1935
1.74G
                   dPtr [col] + w * sPtr [col],
1936
1.74G
                   1.0f);
1937
    
1938
1.74G
    }
1939
1940
13.7M
  }
1941
        
1942
/******************************************************************************/
1943
1944
void RefResampleAcross16 (const uint16 *sPtr,
1945
              uint16 *dPtr,
1946
              uint32 dCount,
1947
              const int32 *coord,
1948
              const int16 *wPtr,
1949
              uint32 wCount,
1950
              uint32 wStep,
1951
              uint32 pixelRange)
1952
20.2M
  {
1953
  
1954
705M
  for (uint32 j = 0; j < dCount; j++)
1955
685M
    {
1956
    
1957
685M
    int32 sCoord = coord [j];
1958
    
1959
685M
    int32 sFract = sCoord &  kResampleSubsampleMask;
1960
685M
    int32 sPixel = sCoord >> kResampleSubsampleBits;
1961
    
1962
685M
    const int16  *w = wPtr + sFract * wStep;
1963
685M
    const uint16 *s = sPtr + sPixel;
1964
    
1965
685M
    int32 total = w [0] * (int32) s [0];
1966
    
1967
4.87G
    for (uint32 k = 1; k < wCount; k++)
1968
4.19G
      {
1969
      
1970
4.19G
      total += w [k] * (int32) s [k];
1971
      
1972
4.19G
      }
1973
      
1974
685M
    dPtr [j] = (uint16) Pin_int32 (0,
1975
685M
                     (total + 8192) >> 14,
1976
685M
                     pixelRange);
1977
    
1978
685M
    }
1979
    
1980
20.2M
  }
1981
        
1982
/******************************************************************************/
1983
1984
void RefResampleAcross32 (const real32 *sPtr,
1985
              real32 *dPtr,
1986
              uint32 dCount,
1987
              const int32 *coord,
1988
              const real32 *wPtr,
1989
              uint32 wCount,
1990
              uint32 wStep)
1991
13.7M
  {
1992
1993
636M
  for (uint32 j = 0; j < dCount; j++)
1994
623M
    {
1995
    
1996
623M
    int32 sCoord = coord [j];
1997
    
1998
623M
    int32 sFract = sCoord &  kResampleSubsampleMask;
1999
623M
    int32 sPixel = sCoord >> kResampleSubsampleBits;
2000
    
2001
623M
    const real32 *w = wPtr + sFract * wStep;
2002
623M
    const real32 *s = sPtr + sPixel;
2003
    
2004
623M
    real32 total = w [0] * s [0];
2005
    
2006
4.91G
    for (uint32 k = 1; k < wCount; k++)
2007
4.29G
      {
2008
      
2009
4.29G
      total += w [k] * s [k];
2010
      
2011
4.29G
      }
2012
      
2013
623M
    dPtr [j] = Pin_real32 (0.0f, total, 1.0f);
2014
    
2015
623M
    }
2016
    
2017
13.7M
  }
2018
        
2019
/*****************************************************************************/
2020
2021
bool RefEqualBytes (const void *sPtr,
2022
          const void *dPtr,
2023
          uint32 count)
2024
0
  {
2025
  
2026
0
  return memcmp (dPtr, sPtr, count) == 0;
2027
  
2028
0
  }
2029
2030
/*****************************************************************************/
2031
2032
bool RefEqualArea8 (const uint8 *sPtr,
2033
            const uint8 *dPtr,
2034
            uint32 rows,
2035
            uint32 cols,
2036
            uint32 planes,
2037
            int32 sRowStep,
2038
            int32 sColStep,
2039
            int32 sPlaneStep,
2040
            int32 dRowStep,
2041
            int32 dColStep,
2042
            int32 dPlaneStep)
2043
0
  {
2044
  
2045
0
  for (uint32 row = 0; row < rows; row++)
2046
0
    {
2047
    
2048
0
    const uint8 *sPtr1 = sPtr;
2049
0
    const uint8 *dPtr1 = dPtr;
2050
          
2051
0
    for (uint32 col = 0; col < cols; col++)
2052
0
      {
2053
      
2054
0
      const uint8 *sPtr2 = sPtr1;
2055
0
      const uint8 *dPtr2 = dPtr1;
2056
            
2057
0
      for (uint32 plane = 0; plane < planes; plane++)
2058
0
        {
2059
      
2060
0
        if (*dPtr2 != *sPtr2)
2061
0
          return false;
2062
        
2063
0
        sPtr2 += sPlaneStep;
2064
0
        dPtr2 += dPlaneStep;
2065
        
2066
0
        }
2067
      
2068
0
      sPtr1 += sColStep;
2069
0
      dPtr1 += dColStep;
2070
2071
0
      }
2072
      
2073
0
    sPtr += sRowStep;
2074
0
    dPtr += dRowStep;
2075
    
2076
0
    }
2077
2078
0
  return true;
2079
2080
0
  }
2081
2082
/*****************************************************************************/
2083
2084
bool RefEqualArea16 (const uint16 *sPtr,
2085
           const uint16 *dPtr,
2086
           uint32 rows,
2087
           uint32 cols,
2088
           uint32 planes,
2089
           int32 sRowStep,
2090
           int32 sColStep,
2091
           int32 sPlaneStep,
2092
           int32 dRowStep,
2093
           int32 dColStep,
2094
           int32 dPlaneStep)
2095
0
  {
2096
  
2097
0
  for (uint32 row = 0; row < rows; row++)
2098
0
    {
2099
    
2100
0
    const uint16 *sPtr1 = sPtr;
2101
0
    const uint16 *dPtr1 = dPtr;
2102
          
2103
0
    for (uint32 col = 0; col < cols; col++)
2104
0
      {
2105
      
2106
0
      const uint16 *sPtr2 = sPtr1;
2107
0
      const uint16 *dPtr2 = dPtr1;
2108
            
2109
0
      for (uint32 plane = 0; plane < planes; plane++)
2110
0
        {
2111
      
2112
0
        if (*dPtr2 != *sPtr2)
2113
0
          return false;
2114
        
2115
0
        sPtr2 += sPlaneStep;
2116
0
        dPtr2 += dPlaneStep;
2117
        
2118
0
        }
2119
      
2120
0
      sPtr1 += sColStep;
2121
0
      dPtr1 += dColStep;
2122
2123
0
      }
2124
      
2125
0
    sPtr += sRowStep;
2126
0
    dPtr += dRowStep;
2127
    
2128
0
    }
2129
2130
0
  return true;
2131
2132
0
  }
2133
2134
/*****************************************************************************/
2135
2136
bool RefEqualArea32 (const uint32 *sPtr,
2137
           const uint32 *dPtr,
2138
           uint32 rows,
2139
           uint32 cols,
2140
           uint32 planes,
2141
           int32 sRowStep,
2142
           int32 sColStep,
2143
           int32 sPlaneStep,
2144
           int32 dRowStep,
2145
           int32 dColStep,
2146
           int32 dPlaneStep)
2147
0
  {
2148
    
2149
0
  for (uint32 row = 0; row < rows; row++)
2150
0
    {
2151
    
2152
0
    const uint32 *sPtr1 = sPtr;
2153
0
    const uint32 *dPtr1 = dPtr;
2154
          
2155
0
    for (uint32 col = 0; col < cols; col++)
2156
0
      {
2157
      
2158
0
      const uint32 *sPtr2 = sPtr1;
2159
0
      const uint32 *dPtr2 = dPtr1;
2160
            
2161
0
      for (uint32 plane = 0; plane < planes; plane++)
2162
0
        {
2163
      
2164
0
        if (*dPtr2 != *sPtr2)
2165
0
          return false;
2166
        
2167
0
        sPtr2 += sPlaneStep;
2168
0
        dPtr2 += dPlaneStep;
2169
        
2170
0
        }
2171
      
2172
0
      sPtr1 += sColStep;
2173
0
      dPtr1 += dColStep;
2174
2175
0
      }
2176
      
2177
0
    sPtr += sRowStep;
2178
0
    dPtr += dRowStep;
2179
    
2180
0
    }
2181
2182
0
  return true;
2183
2184
0
  }
2185
2186
/*****************************************************************************/
2187
2188
void RefVignetteMask16 (uint16 *mPtr,
2189
            uint32 rows,
2190
            uint32 cols,
2191
            int32 rowStep,
2192
            int64 offsetH,
2193
            int64 offsetV,
2194
            int64 stepH,
2195
            int64 stepV,
2196
            uint32 tBits,
2197
            const uint16 *table)
2198
0
  {
2199
  
2200
0
  uint32 tShift = 32 - tBits;
2201
0
  uint32 tRound = (1 << (tShift - 1));
2202
0
  uint32 tLimit = 1 << tBits;
2203
  
2204
0
  for (uint32 row = 0; row < rows; row++)
2205
0
    {
2206
    
2207
0
    int64 baseDelta = (offsetV + 32768) >> 16;
2208
    
2209
0
    baseDelta = baseDelta * baseDelta + tRound;
2210
    
2211
0
    int64 deltaH = offsetH + 32768;
2212
    
2213
0
    for (uint32 col = 0; col < cols; col++)
2214
0
      {
2215
      
2216
0
      int64 temp = deltaH >> 16;
2217
      
2218
0
      int64 delta = baseDelta + (temp * temp);
2219
      
2220
0
      uint32 index = Min_uint32 ((uint32) (delta >> tShift), tLimit);
2221
      
2222
0
      mPtr [col] = table [index];
2223
            
2224
0
      deltaH += stepH;
2225
      
2226
0
      }
2227
      
2228
0
    offsetV += stepV;
2229
    
2230
0
    mPtr += rowStep;
2231
    
2232
0
    }
2233
  
2234
0
  }
2235
2236
/*****************************************************************************/
2237
2238
void RefVignette16 (int16 *sPtr,
2239
          const uint16 *mPtr,
2240
          uint32 rows,
2241
          uint32 cols,
2242
          uint32 planes,
2243
          int32 sRowStep,
2244
          int32 sPlaneStep,
2245
          int32 mRowStep,
2246
          uint32 mBits)
2247
0
  {
2248
  
2249
0
  const uint32 mRound = 1 << (mBits - 1);
2250
2251
0
  switch (planes)
2252
0
    {
2253
    
2254
0
    case 1:
2255
0
      {
2256
      
2257
0
      for (uint32 row = 0; row < rows; row++)
2258
0
        {
2259
    
2260
0
        for (uint32 col = 0; col < cols; col++)
2261
0
          {
2262
      
2263
0
          uint32 s = sPtr [col] + 32768;
2264
      
2265
0
          uint32 m = mPtr [col];
2266
      
2267
0
          s = (s * m + mRound) >> mBits;
2268
      
2269
0
          s = Min_uint32 (s, 65535);
2270
      
2271
0
          sPtr [col] = (int16) (s - 32768); 
2272
      
2273
0
          }
2274
    
2275
0
        sPtr += sRowStep;
2276
    
2277
0
        mPtr += mRowStep;
2278
    
2279
0
        }
2280
2281
0
      break;
2282
      
2283
0
      }
2284
2285
0
    case 3:
2286
0
      {
2287
2288
0
      int16 *rPtr = sPtr;
2289
0
      int16 *gPtr = rPtr + sPlaneStep;
2290
0
      int16 *bPtr = gPtr + sPlaneStep;
2291
      
2292
0
      for (uint32 row = 0; row < rows; row++)
2293
0
        {
2294
    
2295
0
        for (uint32 col = 0; col < cols; col++)
2296
0
          {
2297
      
2298
0
          uint32 r = rPtr [col] + 32768;
2299
0
          uint32 g = gPtr [col] + 32768;
2300
0
          uint32 b = bPtr [col] + 32768;
2301
      
2302
0
          uint32 m = mPtr [col];
2303
      
2304
0
          r = (r * m + mRound) >> mBits;
2305
0
          g = (g * m + mRound) >> mBits;
2306
0
          b = (b * m + mRound) >> mBits;
2307
      
2308
0
          r = Min_uint32 (r, 65535);
2309
0
          g = Min_uint32 (g, 65535);
2310
0
          b = Min_uint32 (b, 65535);
2311
      
2312
0
          rPtr [col] = (int16) (r - 32768); 
2313
0
          gPtr [col] = (int16) (g - 32768); 
2314
0
          bPtr [col] = (int16) (b - 32768); 
2315
      
2316
0
          }
2317
    
2318
0
        rPtr += sRowStep;
2319
0
        gPtr += sRowStep;
2320
0
        bPtr += sRowStep;
2321
    
2322
0
        mPtr += mRowStep;
2323
    
2324
0
        }
2325
2326
0
      break;
2327
      
2328
0
      }
2329
2330
0
    case 4:
2331
0
      {
2332
      
2333
0
      int16 *aPtr = sPtr;
2334
0
      int16 *bPtr = aPtr + sPlaneStep;
2335
0
      int16 *cPtr = bPtr + sPlaneStep;
2336
0
      int16 *dPtr = cPtr + sPlaneStep;
2337
      
2338
0
      for (uint32 row = 0; row < rows; row++)
2339
0
        {
2340
    
2341
0
        for (uint32 col = 0; col < cols; col++)
2342
0
          {
2343
      
2344
0
          uint32 a = aPtr [col] + 32768;
2345
0
          uint32 b = bPtr [col] + 32768;
2346
0
          uint32 c = cPtr [col] + 32768;
2347
0
          uint32 d = dPtr [col] + 32768;
2348
      
2349
0
          uint32 m = mPtr [col];
2350
      
2351
0
          a = (a * m + mRound) >> mBits;
2352
0
          b = (b * m + mRound) >> mBits;
2353
0
          c = (c * m + mRound) >> mBits;
2354
0
          d = (d * m + mRound) >> mBits;
2355
      
2356
0
          a = Min_uint32 (a, 65535);
2357
0
          b = Min_uint32 (b, 65535);
2358
0
          c = Min_uint32 (c, 65535);
2359
0
          d = Min_uint32 (d, 65535);
2360
      
2361
0
          aPtr [col] = (int16) (a - 32768); 
2362
0
          bPtr [col] = (int16) (b - 32768); 
2363
0
          cPtr [col] = (int16) (c - 32768); 
2364
0
          dPtr [col] = (int16) (d - 32768); 
2365
      
2366
0
          }
2367
    
2368
0
        aPtr += sRowStep;
2369
0
        bPtr += sRowStep;
2370
0
        cPtr += sRowStep;
2371
0
        dPtr += sRowStep;
2372
    
2373
0
        mPtr += mRowStep;
2374
    
2375
0
        }
2376
2377
0
      break;
2378
      
2379
0
      }
2380
2381
0
    default:
2382
0
      {
2383
      
2384
0
      for (uint32 plane = 0; plane < planes; plane++)
2385
0
        {
2386
2387
0
        int16 *planePtr = sPtr;
2388
2389
0
        const uint16 *maskPtr = mPtr;
2390
            
2391
0
        for (uint32 row = 0; row < rows; row++)
2392
0
          {
2393
    
2394
0
          for (uint32 col = 0; col < cols; col++)
2395
0
            {
2396
2397
0
            uint32 s = planePtr [col] + 32768;
2398
      
2399
0
            uint32 m = maskPtr [col];
2400
      
2401
0
            s = (s * m + mRound) >> mBits;
2402
      
2403
0
            s = Min_uint32 (s, 65535);
2404
      
2405
0
            planePtr [col] = (int16) (s - 32768); 
2406
2407
0
            }
2408
    
2409
0
          planePtr += sRowStep;
2410
    
2411
0
          maskPtr += mRowStep;
2412
2413
0
          }
2414
2415
0
        sPtr += sPlaneStep;
2416
    
2417
0
        }
2418
2419
0
      break;
2420
      
2421
0
      }
2422
  
2423
0
    }
2424
  
2425
0
  }
2426
2427
/*****************************************************************************/
2428
2429
void RefVignette32 (real32 *sPtr,
2430
          const uint16 *mPtr,
2431
          uint32 rows,
2432
          uint32 cols,
2433
          uint32 planes,
2434
          int32 sRowStep,
2435
          int32 sPlaneStep,
2436
          int32 mRowStep,
2437
          uint32 mBits)
2438
0
  {
2439
  
2440
0
  const real32 kNorm = 1.0f / (1 << mBits);
2441
2442
0
  switch (planes)
2443
0
    {
2444
    
2445
0
    case 1:
2446
0
      {
2447
      
2448
0
      for (uint32 row = 0; row < rows; row++)
2449
0
        {
2450
    
2451
0
        for (uint32 col = 0; col < cols; col++)
2452
0
          {
2453
      
2454
0
          real32 s = sPtr [col];
2455
2456
0
          uint16 m = mPtr [col];
2457
2458
0
          real32 scale = m * kNorm;
2459
      
2460
0
          s = Min_real32 (s * scale, 1.0f);
2461
      
2462
0
          sPtr [col] = s;
2463
      
2464
0
          }
2465
    
2466
0
        sPtr += sRowStep;
2467
    
2468
0
        mPtr += mRowStep;
2469
    
2470
0
        }
2471
2472
0
      break;
2473
      
2474
0
      }
2475
2476
0
    case 3:
2477
0
      {
2478
2479
0
      real32 *rPtr = sPtr;
2480
0
      real32 *gPtr = rPtr + sPlaneStep;
2481
0
      real32 *bPtr = gPtr + sPlaneStep;
2482
      
2483
0
      for (uint32 row = 0; row < rows; row++)
2484
0
        {
2485
    
2486
0
        for (uint32 col = 0; col < cols; col++)
2487
0
          {
2488
      
2489
0
          real32 r = rPtr [col];
2490
0
          real32 g = gPtr [col];
2491
0
          real32 b = bPtr [col];
2492
      
2493
0
          uint16 m = mPtr [col];
2494
      
2495
0
          real32 scale = m * kNorm;
2496
2497
0
          r = Min_real32 (r * scale, 1.0f);
2498
0
          g = Min_real32 (g * scale, 1.0f);
2499
0
          b = Min_real32 (b * scale, 1.0f);
2500
      
2501
0
          rPtr [col] = r;
2502
0
          gPtr [col] = g;
2503
0
          bPtr [col] = b;
2504
      
2505
0
          }
2506
    
2507
0
        rPtr += sRowStep;
2508
0
        gPtr += sRowStep;
2509
0
        bPtr += sRowStep;
2510
    
2511
0
        mPtr += mRowStep;
2512
    
2513
0
        }
2514
2515
0
      break;
2516
      
2517
0
      }
2518
2519
0
    case 4:
2520
0
      {
2521
      
2522
0
      real32 *aPtr = sPtr;
2523
0
      real32 *bPtr = aPtr + sPlaneStep;
2524
0
      real32 *cPtr = bPtr + sPlaneStep;
2525
0
      real32 *dPtr = cPtr + sPlaneStep;
2526
      
2527
0
      for (uint32 row = 0; row < rows; row++)
2528
0
        {
2529
    
2530
0
        for (uint32 col = 0; col < cols; col++)
2531
0
          {
2532
2533
0
          real32 a = aPtr [col];
2534
0
          real32 b = bPtr [col];
2535
0
          real32 c = cPtr [col];
2536
0
          real32 d = dPtr [col];
2537
      
2538
0
          uint16 m = mPtr [col];
2539
2540
0
          real32 scale = m * kNorm;
2541
2542
0
          a = Min_real32 (a * scale, 1.0f);
2543
0
          b = Min_real32 (b * scale, 1.0f);
2544
0
          c = Min_real32 (c * scale, 1.0f);
2545
0
          d = Min_real32 (d * scale, 1.0f);
2546
      
2547
0
          aPtr [col] = a;
2548
0
          bPtr [col] = b;
2549
0
          cPtr [col] = c;
2550
0
          dPtr [col] = d;
2551
      
2552
0
          }
2553
    
2554
0
        aPtr += sRowStep;
2555
0
        bPtr += sRowStep;
2556
0
        cPtr += sRowStep;
2557
0
        dPtr += sRowStep;
2558
    
2559
0
        mPtr += mRowStep;
2560
    
2561
0
        }
2562
2563
0
      break;
2564
      
2565
0
      }
2566
2567
0
    default:
2568
0
      {
2569
      
2570
0
      for (uint32 plane = 0; plane < planes; plane++)
2571
0
        {
2572
2573
0
        real32 *planePtr = sPtr;
2574
2575
0
        const uint16 *maskPtr = mPtr;
2576
            
2577
0
        for (uint32 row = 0; row < rows; row++)
2578
0
          {
2579
    
2580
0
          for (uint32 col = 0; col < cols; col++)
2581
0
            {
2582
2583
0
            real32 s = planePtr [col];
2584
      
2585
0
            uint16 m = maskPtr [col];
2586
2587
0
            real32 scale = m * kNorm;
2588
      
2589
0
            s = Min_real32 (s * scale, 1.0f);
2590
      
2591
0
            planePtr [col] = s;
2592
2593
0
            }
2594
    
2595
0
          planePtr += sRowStep;
2596
    
2597
0
          maskPtr += mRowStep;
2598
2599
0
          }
2600
2601
0
        sPtr += sPlaneStep;
2602
    
2603
0
        }
2604
2605
0
      break;
2606
      
2607
0
      }
2608
  
2609
0
    }
2610
  
2611
0
  }
2612
2613
/******************************************************************************/
2614
2615
void RefMapArea16 (uint16 *dPtr,
2616
           uint32 count0,
2617
           uint32 count1,
2618
           uint32 count2,
2619
           int32 step0,
2620
           int32 step1,
2621
           int32 step2,
2622
           const uint16 *map)
2623
0
  {
2624
  
2625
0
  if (step2 == 1 && count2 >= 32)
2626
0
    {
2627
  
2628
0
    for (uint32 index0 = 0; index0 < count0; index0++)
2629
0
      {
2630
      
2631
0
      uint16 *d1 = dPtr;
2632
      
2633
0
      for (uint32 index1 = 0; index1 < count1; index1++)
2634
0
        {
2635
        
2636
0
        uint16 *d2 = d1;
2637
        
2638
0
        uint32 count = count2;
2639
        
2640
        // Get the data 32-bit aligned if it is not.
2641
        
2642
0
        if (!IsAligned32 (dPtr))
2643
0
          {
2644
          
2645
0
          d2 [0] = map [d2 [0]];
2646
          
2647
0
          count--;
2648
          
2649
0
          d2++;
2650
          
2651
0
          }
2652
      
2653
        // Use 32-bit reads and writes for bulk processing.
2654
          
2655
0
        uint32 *dPtr32 = (uint32 *) d2;
2656
          
2657
        // Process in blocks of 16 pixels.
2658
          
2659
0
        uint32 blocks = count >> 4;
2660
        
2661
0
        count -= blocks << 4;
2662
0
        d2    += blocks << 4;
2663
        
2664
0
        while (blocks--)
2665
0
          {
2666
        
2667
0
          uint32 x0, x1, x2, x3, x4, x5, x6, x7;
2668
0
          uint32 p0, p1, p2, p3, p4, p5, p6, p7;
2669
          
2670
          // Use 32 bit reads & writes, and pack and unpack the 16-bit values.
2671
          // This results in slightly higher performance.
2672
          
2673
          // Note that this code runs on both little-endian and big-endian systems,
2674
          // since the pixels are either never swapped or double swapped.
2675
          
2676
0
          x0 = dPtr32 [0];
2677
0
          x1 = dPtr32 [1];
2678
0
          x2 = dPtr32 [2];
2679
0
          x3 = dPtr32 [3];
2680
          
2681
0
          p0 = map [x0 >> 16    ];
2682
0
          p1 = map [x0 & 0x0FFFF];
2683
0
          p2 = map [x1 >> 16    ];
2684
0
          p3 = map [x1 & 0x0FFFF];
2685
0
          p4 = map [x2 >> 16    ];
2686
0
          p5 = map [x2 & 0x0FFFF];
2687
0
          p6 = map [x3 >> 16    ];
2688
0
          p7 = map [x3 & 0x0FFFF];
2689
          
2690
0
          x0 = (p0 << 16) | p1;
2691
0
          x1 = (p2 << 16) | p3;
2692
0
          x2 = (p4 << 16) | p5;
2693
0
          x3 = (p6 << 16) | p7;
2694
          
2695
0
          x4 = dPtr32 [4];
2696
0
          x5 = dPtr32 [5];
2697
0
          x6 = dPtr32 [6];
2698
0
          x7 = dPtr32 [7];
2699
          
2700
0
          dPtr32 [0] = x0;
2701
0
          dPtr32 [1] = x1;
2702
0
          dPtr32 [2] = x2;
2703
0
          dPtr32 [3] = x3;
2704
              
2705
0
          p0 = map [x4 >> 16    ];
2706
0
          p1 = map [x4 & 0x0FFFF];
2707
0
          p2 = map [x5 >> 16    ];
2708
0
          p3 = map [x5 & 0x0FFFF];
2709
0
          p4 = map [x6 >> 16    ];
2710
0
          p5 = map [x6 & 0x0FFFF];
2711
0
          p6 = map [x7 >> 16    ];
2712
0
          p7 = map [x7 & 0x0FFFF];
2713
          
2714
0
          x4 = (p0 << 16) | p1;
2715
0
          x5 = (p2 << 16) | p3;
2716
0
          x6 = (p4 << 16) | p5;
2717
0
          x7 = (p6 << 16) | p7;
2718
          
2719
0
          dPtr32 [4] = x4;
2720
0
          dPtr32 [5] = x5;
2721
0
          dPtr32 [6] = x6;
2722
0
          dPtr32 [7] = x7;
2723
              
2724
0
          dPtr32 += 8;
2725
          
2726
0
          }
2727
        
2728
        // Process remaining columns.
2729
        
2730
0
        for (uint32 j = 0; j < count; j++)
2731
0
          {
2732
          
2733
0
          d2 [j] = map [d2 [j]];
2734
          
2735
0
          }
2736
  
2737
0
        d1 += step1;
2738
        
2739
0
        }
2740
        
2741
0
      dPtr += step0;
2742
      
2743
0
      }
2744
      
2745
0
    }
2746
    
2747
0
  else
2748
0
    {
2749
  
2750
0
    for (uint32 index0 = 0; index0 < count0; index0++)
2751
0
      {
2752
      
2753
0
      uint16 *d1 = dPtr;
2754
      
2755
0
      for (uint32 index1 = 0; index1 < count1; index1++)
2756
0
        {
2757
        
2758
0
        uint16 *d2 = d1;
2759
        
2760
0
        for (uint32 index2 = 0; index2 < count2; index2++)
2761
0
          {
2762
          
2763
0
          d2 [0] = map [d2 [0]];
2764
          
2765
0
          d2 += step2;
2766
          
2767
0
          }
2768
        
2769
0
        d1 += step1;
2770
        
2771
0
        }
2772
        
2773
0
      dPtr += step0;
2774
      
2775
0
      }
2776
      
2777
0
    }
2778
    
2779
0
  }
2780
2781
/*****************************************************************************/