Coverage Report

Created: 2025-11-09 06:37

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
302k
  {
36
  
37
302k
  memset (dPtr, 0, count);
38
  
39
302k
  }
40
           
41
/*****************************************************************************/
42
43
void RefCopyBytes (const void *sPtr,
44
           void *dPtr,
45
           uint32 count)
46
896M
  {
47
  
48
896M
  memcpy (dPtr, sPtr, count);
49
  
50
896M
  }
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
13.5k
  {
93
  
94
405k
  for (uint32 row = 0; row < rows; row++)
95
391k
    {
96
    
97
391k
    uint8 *dPtr1 = dPtr;
98
          
99
2.69M
    for (uint32 col = 0; col < cols; col++)
100
2.30M
      {
101
      
102
2.30M
      uint8 *dPtr2 = dPtr1;
103
            
104
61.0M
      for (uint32 plane = 0; plane < planes; plane++)
105
58.6M
        {
106
      
107
58.6M
        *dPtr2 = value;
108
        
109
58.6M
        dPtr2 += planeStep;
110
        
111
58.6M
        }
112
      
113
2.30M
      dPtr1 += colStep;
114
115
2.30M
      }
116
      
117
391k
    dPtr += rowStep;
118
    
119
391k
    }
120
      
121
13.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
39.0k
  {
134
  
135
1.97M
  for (uint32 row = 0; row < rows; row++)
136
1.93M
    {
137
    
138
1.93M
    uint16 *dPtr1 = dPtr;
139
          
140
18.3M
    for (uint32 col = 0; col < cols; col++)
141
16.4M
      {
142
      
143
16.4M
      uint16 *dPtr2 = dPtr1;
144
            
145
305M
      for (uint32 plane = 0; plane < planes; plane++)
146
289M
        {
147
      
148
289M
        *dPtr2 = value;
149
        
150
289M
        dPtr2 += planeStep;
151
        
152
289M
        }
153
      
154
16.4M
      dPtr1 += colStep;
155
156
16.4M
      }
157
      
158
1.93M
    dPtr += rowStep;
159
    
160
1.93M
    }
161
      
162
39.0k
  }
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
13.6k
  {
175
  
176
247k
  for (uint32 row = 0; row < rows; row++)
177
233k
    {
178
    
179
233k
    uint32 *dPtr1 = dPtr;
180
          
181
2.99M
    for (uint32 col = 0; col < cols; col++)
182
2.75M
      {
183
      
184
2.75M
      uint32 *dPtr2 = dPtr1;
185
            
186
51.6M
      for (uint32 plane = 0; plane < planes; plane++)
187
48.8M
        {
188
      
189
48.8M
        *dPtr2 = value;
190
        
191
48.8M
        dPtr2 += planeStep;
192
        
193
48.8M
        }
194
      
195
2.75M
      dPtr1 += colStep;
196
197
2.75M
      }
198
      
199
233k
    dPtr += rowStep;
200
    
201
233k
    }
202
      
203
13.6k
  }
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
38.6k
  {
219
  
220
6.38M
  for (uint32 row = 0; row < rows; row++)
221
6.34M
    {
222
    
223
6.34M
    const uint8 *sPtr1 = sPtr;
224
6.34M
          uint8 *dPtr1 = dPtr;
225
          
226
193M
    for (uint32 col = 0; col < cols; col++)
227
187M
      {
228
      
229
187M
      const uint8 *sPtr2 = sPtr1;
230
187M
            uint8 *dPtr2 = dPtr1;
231
            
232
2.60G
      for (uint32 plane = 0; plane < planes; plane++)
233
2.41G
        {
234
      
235
2.41G
        *dPtr2 = *sPtr2;
236
        
237
2.41G
        sPtr2 += sPlaneStep;
238
2.41G
        dPtr2 += dPlaneStep;
239
        
240
2.41G
        }
241
      
242
187M
      sPtr1 += sColStep;
243
187M
      dPtr1 += dColStep;
244
245
187M
      }
246
      
247
6.34M
    sPtr += sRowStep;
248
6.34M
    dPtr += dRowStep;
249
    
250
6.34M
    }
251
    
252
38.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
868k
  {
268
  
269
6.09M
  for (uint32 row = 0; row < rows; row++)
270
5.22M
    {
271
    
272
5.22M
    const uint16 *sPtr1 = sPtr;
273
5.22M
          uint16 *dPtr1 = dPtr;
274
          
275
393M
    for (uint32 col = 0; col < cols; col++)
276
388M
      {
277
      
278
388M
      const uint16 *sPtr2 = sPtr1;
279
388M
            uint16 *dPtr2 = dPtr1;
280
            
281
10.7G
      for (uint32 plane = 0; plane < planes; plane++)
282
10.3G
        {
283
      
284
10.3G
        *dPtr2 = *sPtr2;
285
        
286
10.3G
        sPtr2 += sPlaneStep;
287
10.3G
        dPtr2 += dPlaneStep;
288
        
289
10.3G
        }
290
      
291
388M
      sPtr1 += sColStep;
292
388M
      dPtr1 += dColStep;
293
294
388M
      }
295
      
296
5.22M
    sPtr += sRowStep;
297
5.22M
    dPtr += dRowStep;
298
    
299
5.22M
    }
300
    
301
868k
  }
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
941k
  {
317
    
318
3.45M
  for (uint32 row = 0; row < rows; row++)
319
2.51M
    {
320
    
321
2.51M
    const uint32 *sPtr1 = sPtr;
322
2.51M
          uint32 *dPtr1 = dPtr;
323
          
324
199M
    for (uint32 col = 0; col < cols; col++)
325
196M
      {
326
      
327
196M
      const uint32 *sPtr2 = sPtr1;
328
196M
            uint32 *dPtr2 = dPtr1;
329
            
330
5.21G
      for (uint32 plane = 0; plane < planes; plane++)
331
5.01G
        {
332
      
333
5.01G
        *dPtr2 = *sPtr2;
334
        
335
5.01G
        sPtr2 += sPlaneStep;
336
5.01G
        dPtr2 += dPlaneStep;
337
        
338
5.01G
        }
339
      
340
196M
      sPtr1 += sColStep;
341
196M
      dPtr1 += dColStep;
342
343
196M
      }
344
      
345
2.51M
    sPtr += sRowStep;
346
2.51M
    dPtr += dRowStep;
347
    
348
2.51M
    }
349
    
350
941k
  }
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
14.6k
  {
366
  
367
29.2k
  for (uint32 row = 0; row < rows; row++)
368
14.6k
    {
369
    
370
14.6k
    const uint8  *sPtr1 = sPtr;
371
14.6k
          uint16 *dPtr1 = dPtr;
372
          
373
29.2k
    for (uint32 col = 0; col < cols; col++)
374
14.6k
      {
375
      
376
14.6k
      const uint8  *sPtr2 = sPtr1;
377
14.6k
            uint16 *dPtr2 = dPtr1;
378
            
379
166M
      for (uint32 plane = 0; plane < planes; plane++)
380
166M
        {
381
      
382
166M
        *dPtr2 = *sPtr2;
383
        
384
166M
        sPtr2 += sPlaneStep;
385
166M
        dPtr2 += dPlaneStep;
386
        
387
166M
        }
388
      
389
14.6k
      sPtr1 += sColStep;
390
14.6k
      dPtr1 += dColStep;
391
392
14.6k
      }
393
      
394
14.6k
    sPtr += sRowStep;
395
14.6k
    dPtr += dRowStep;
396
    
397
14.6k
    }
398
    
399
14.6k
  }
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
350k
  {
666
  
667
350k
  real32 scale = 1.0f / (real32) pixelRange;
668
  
669
2.99M
  for (uint32 row = 0; row < rows; row++)
670
2.64M
    {
671
    
672
2.64M
    const uint16 *sPtr1 = sPtr;
673
2.64M
          real32 *dPtr1 = dPtr;
674
          
675
138M
    for (uint32 col = 0; col < cols; col++)
676
135M
      {
677
      
678
135M
      const uint16 *sPtr2 = sPtr1;
679
135M
            real32 *dPtr2 = dPtr1;
680
            
681
1.56G
      for (uint32 plane = 0; plane < planes; plane++)
682
1.42G
        {
683
      
684
1.42G
        *dPtr2 = scale * (real32) *sPtr2;
685
        
686
1.42G
        sPtr2 += sPlaneStep;
687
1.42G
        dPtr2 += dPlaneStep;
688
        
689
1.42G
        }
690
      
691
135M
      sPtr1 += sColStep;
692
135M
      dPtr1 += dColStep;
693
694
135M
      }
695
      
696
2.64M
    sPtr += sRowStep;
697
2.64M
    dPtr += dRowStep;
698
    
699
2.64M
    }
700
    
701
350k
  }
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
699k
  {
772
  
773
699k
  real32 scale = (real32) pixelRange;
774
  
775
24.0M
  for (uint32 row = 0; row < rows; row++)
776
23.3M
    {
777
    
778
23.3M
    const real32 *sPtr1 = sPtr;
779
23.3M
          uint8  *dPtr1 = dPtr;
780
          
781
1.60G
    for (uint32 col = 0; col < cols; col++)
782
1.58G
      {
783
      
784
1.58G
      const real32 *sPtr2 = sPtr1;
785
1.58G
            uint8  *dPtr2 = dPtr1;
786
            
787
7.23G
      for (uint32 plane = 0; plane < planes; plane++)
788
5.65G
        {
789
        
790
5.65G
        *dPtr2 = (uint8) (Pin_Overrange (*sPtr2) * scale + 0.5f);
791
        
792
5.65G
        sPtr2 += sPlaneStep;
793
5.65G
        dPtr2 += dPlaneStep;
794
        
795
5.65G
        }
796
      
797
1.58G
      sPtr1 += sColStep;
798
1.58G
      dPtr1 += dColStep;
799
800
1.58G
      }
801
      
802
23.3M
    sPtr += sRowStep;
803
23.3M
    dPtr += dRowStep;
804
    
805
23.3M
    }
806
    
807
699k
  }
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
60.0k
  {
824
  
825
60.0k
  real32 scale = (real32) pixelRange;
826
  
827
1.95M
  for (uint32 row = 0; row < rows; row++)
828
1.89M
    {
829
    
830
1.89M
    const real32 *sPtr1 = sPtr;
831
1.89M
          uint16 *dPtr1 = dPtr;
832
          
833
71.8M
    for (uint32 col = 0; col < cols; col++)
834
69.9M
      {
835
      
836
69.9M
      const real32 *sPtr2 = sPtr1;
837
69.9M
            uint16 *dPtr2 = dPtr1;
838
            
839
319M
      for (uint32 plane = 0; plane < planes; plane++)
840
249M
        {
841
      
842
249M
        *dPtr2 = (uint16) (Pin_Overrange (*sPtr2) * scale + 0.5f);
843
        
844
249M
        sPtr2 += sPlaneStep;
845
249M
        dPtr2 += dPlaneStep;
846
        
847
249M
        }
848
      
849
69.9M
      sPtr1 += sColStep;
850
69.9M
      dPtr1 += dColStep;
851
852
69.9M
      }
853
      
854
1.89M
    sPtr += sRowStep;
855
1.89M
    dPtr += dRowStep;
856
    
857
1.89M
    }
858
    
859
60.0k
  }
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.06M
  {
1006
  
1007
1.06M
  const uint16 *sPtr0 = sPtr + phaseV * rowStep +
1008
1.06M
                 phaseH * colStep;
1009
                 
1010
1.06M
  int32 backStepV = (repeatV - 1) * rowStep;
1011
1.06M
  int32 backStepH = (repeatH - 1) * colStep;
1012
  
1013
91.5M
  for (uint32 row = 0; row < rows; row++)
1014
90.5M
    {
1015
    
1016
90.5M
    const uint16 *sPtr1 = sPtr0;
1017
90.5M
          uint16 *dPtr1 = dPtr;
1018
          
1019
90.5M
    uint32 colPhase = phaseH;
1020
          
1021
4.70G
    for (uint32 col = 0; col < cols; col++)
1022
4.61G
      {
1023
      
1024
4.61G
      const uint16 *sPtr2 = sPtr1;
1025
4.61G
            uint16 *dPtr2 = dPtr1;
1026
            
1027
9.79G
      for (uint32 plane = 0; plane < planes; plane++)
1028
5.18G
        {
1029
        
1030
5.18G
        *dPtr2 = *sPtr2;
1031
        
1032
5.18G
        sPtr2 += planeStep;
1033
5.18G
        dPtr2 += planeStep;
1034
        
1035
5.18G
        }
1036
        
1037
4.61G
      if (++colPhase == repeatH)
1038
2.44G
        {
1039
2.44G
        colPhase = 0;
1040
2.44G
        sPtr1 -= backStepH;
1041
2.44G
        }
1042
2.16G
      else
1043
2.16G
        {
1044
2.16G
        sPtr1 += colStep;
1045
2.16G
        }
1046
        
1047
4.61G
      dPtr1 += colStep;
1048
      
1049
4.61G
      }
1050
      
1051
90.5M
    if (++phaseV == repeatV)
1052
58.6M
      {
1053
58.6M
      phaseV = 0;
1054
58.6M
      sPtr0 -= backStepV;
1055
58.6M
      }
1056
31.8M
    else
1057
31.8M
      {
1058
31.8M
      sPtr0 += rowStep;
1059
31.8M
      }
1060
      
1061
90.5M
    dPtr += rowStep;
1062
            
1063
90.5M
    }
1064
  
1065
1.06M
  }
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
1.29M
  {
1082
  
1083
1.29M
  const uint32 *sPtr0 = sPtr + phaseV * rowStep +
1084
1.29M
                 phaseH * colStep;
1085
                 
1086
1.29M
  int32 backStepV = (repeatV - 1) * rowStep;
1087
1.29M
  int32 backStepH = (repeatH - 1) * colStep;
1088
  
1089
33.5M
  for (uint32 row = 0; row < rows; row++)
1090
32.2M
    {
1091
    
1092
32.2M
    const uint32 *sPtr1 = sPtr0;
1093
32.2M
          uint32 *dPtr1 = dPtr;
1094
          
1095
32.2M
    uint32 colPhase = phaseH;
1096
          
1097
1.39G
    for (uint32 col = 0; col < cols; col++)
1098
1.36G
      {
1099
      
1100
1.36G
      const uint32 *sPtr2 = sPtr1;
1101
1.36G
            uint32 *dPtr2 = dPtr1;
1102
            
1103
3.00G
      for (uint32 plane = 0; plane < planes; plane++)
1104
1.64G
        {
1105
        
1106
1.64G
        *dPtr2 = *sPtr2;
1107
        
1108
1.64G
        sPtr2 += planeStep;
1109
1.64G
        dPtr2 += planeStep;
1110
        
1111
1.64G
        }
1112
        
1113
1.36G
      if (++colPhase == repeatH)
1114
871M
        {
1115
871M
        colPhase = 0;
1116
871M
        sPtr1 -= backStepH;
1117
871M
        }
1118
493M
      else
1119
493M
        {
1120
493M
        sPtr1 += colStep;
1121
493M
        }
1122
        
1123
1.36G
      dPtr1 += colStep;
1124
      
1125
1.36G
      }
1126
      
1127
32.2M
    if (++phaseV == repeatV)
1128
13.1M
      {
1129
13.1M
      phaseV = 0;
1130
13.1M
      sPtr0 -= backStepV;
1131
13.1M
      }
1132
19.1M
    else
1133
19.1M
      {
1134
19.1M
      sPtr0 += rowStep;
1135
19.1M
      }
1136
      
1137
32.2M
    dPtr += rowStep;
1138
            
1139
32.2M
    }
1140
  
1141
1.29M
  }
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
3.02M
  {
1196
  
1197
107M
  for (uint32 j = 0; j < cols; j++)
1198
104M
    {
1199
    
1200
104M
    const uint16 *p = sPtr + (j >> sShift);
1201
    
1202
104M
    uint32 count = kernCounts [patPhase];
1203
    
1204
104M
    const int32  *offsets = kernOffsets [patPhase];
1205
104M
    const uint16 *weights = kernWeights [patPhase];
1206
    
1207
104M
    if (++patPhase == patCount)
1208
49.0M
      {
1209
49.0M
      patPhase = 0;
1210
49.0M
      }
1211
      
1212
104M
    uint32 total = 128;
1213
    
1214
333M
    for (uint32 k = 0; k < count; k++)
1215
229M
      {
1216
      
1217
229M
      int32  offset = offsets [k];
1218
229M
      uint32 weight = weights [k];
1219
      
1220
229M
      uint32 pixel = p [offset];
1221
      
1222
229M
      total += pixel * weight;
1223
            
1224
229M
      }
1225
      
1226
104M
    dPtr [j] = (uint16) (total >> 8);
1227
    
1228
104M
    }
1229
        
1230
3.02M
  }
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.50M
  {
1244
  
1245
119M
  for (uint32 j = 0; j < cols; j++)
1246
118M
    {
1247
    
1248
118M
    const real32 *p = sPtr + (j >> sShift);
1249
    
1250
118M
    uint32 count = kernCounts [patPhase];
1251
    
1252
118M
    const int32  *offsets = kernOffsets [patPhase];
1253
118M
    const real32 *weights = kernWeights [patPhase];
1254
    
1255
118M
    if (++patPhase == patCount)
1256
58.9M
      {
1257
58.9M
      patPhase = 0;
1258
58.9M
      }
1259
      
1260
118M
    real32 total = 0.0f;
1261
    
1262
390M
    for (uint32 k = 0; k < count; k++)
1263
271M
      {
1264
      
1265
271M
      int32  offset = offsets [k];
1266
271M
      real32 weight = weights [k];
1267
      
1268
271M
      real32 pixel = p [offset];
1269
      
1270
271M
      total += pixel * weight;
1271
            
1272
271M
      }
1273
      
1274
118M
    dPtr [j] = total;
1275
    
1276
118M
    }
1277
        
1278
1.50M
  }
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
638k
  {
1292
  
1293
638k
  real32 clipA = (real32) cameraWhite [0];
1294
638k
  real32 clipB = (real32) cameraWhite [1];
1295
638k
  real32 clipC = (real32) cameraWhite [2];
1296
  
1297
638k
  real32 m00 = (real32) cameraToRGB [0] [0];
1298
638k
  real32 m01 = (real32) cameraToRGB [0] [1];
1299
638k
  real32 m02 = (real32) cameraToRGB [0] [2];
1300
  
1301
638k
  real32 m10 = (real32) cameraToRGB [1] [0];
1302
638k
  real32 m11 = (real32) cameraToRGB [1] [1];
1303
638k
  real32 m12 = (real32) cameraToRGB [1] [2];
1304
  
1305
638k
  real32 m20 = (real32) cameraToRGB [2] [0];
1306
638k
  real32 m21 = (real32) cameraToRGB [2] [1];
1307
638k
  real32 m22 = (real32) cameraToRGB [2] [2];
1308
  
1309
76.7M
  for (uint32 col = 0; col < count; col++)
1310
76.0M
    {
1311
    
1312
76.0M
    real32 A = sPtrA [col];
1313
76.0M
    real32 B = sPtrB [col];
1314
76.0M
    real32 C = sPtrC [col];
1315
    
1316
76.0M
    A = Min_real32 (A, clipA);
1317
76.0M
    B = Min_real32 (B, clipB);
1318
76.0M
    C = Min_real32 (C, clipC);
1319
    
1320
76.0M
    real32 r = m00 * A + m01 * B + m02 * C;
1321
76.0M
    real32 g = m10 * A + m11 * B + m12 * C;
1322
76.0M
    real32 b = m20 * A + m21 * B + m22 * C;
1323
    
1324
76.0M
    r = Pin_real32 (0.0f, r, 1.0f);
1325
76.0M
    g = Pin_real32 (0.0f, g, 1.0f);
1326
76.0M
    b = Pin_real32 (0.0f, b, 1.0f);
1327
    
1328
76.0M
    dPtrR [col] = r;
1329
76.0M
    dPtrG [col] = g;
1330
76.0M
    dPtrB [col] = b;
1331
    
1332
76.0M
    }
1333
  
1334
638k
  }
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
229k
  {
1349
  
1350
229k
  real32 clipA = (real32) cameraWhite [0];
1351
229k
  real32 clipB = (real32) cameraWhite [1];
1352
229k
  real32 clipC = (real32) cameraWhite [2];
1353
229k
  real32 clipD = (real32) cameraWhite [3];
1354
  
1355
229k
  real32 m00 = (real32) cameraToRGB [0] [0];
1356
229k
  real32 m01 = (real32) cameraToRGB [0] [1];
1357
229k
  real32 m02 = (real32) cameraToRGB [0] [2];
1358
229k
  real32 m03 = (real32) cameraToRGB [0] [3];
1359
  
1360
229k
  real32 m10 = (real32) cameraToRGB [1] [0];
1361
229k
  real32 m11 = (real32) cameraToRGB [1] [1];
1362
229k
  real32 m12 = (real32) cameraToRGB [1] [2];
1363
229k
  real32 m13 = (real32) cameraToRGB [1] [3];
1364
  
1365
229k
  real32 m20 = (real32) cameraToRGB [2] [0];
1366
229k
  real32 m21 = (real32) cameraToRGB [2] [1];
1367
229k
  real32 m22 = (real32) cameraToRGB [2] [2];
1368
229k
  real32 m23 = (real32) cameraToRGB [2] [3];
1369
  
1370
2.30M
  for (uint32 col = 0; col < count; col++)
1371
2.07M
    {
1372
    
1373
2.07M
    real32 A = sPtrA [col];
1374
2.07M
    real32 B = sPtrB [col];
1375
2.07M
    real32 C = sPtrC [col];
1376
2.07M
    real32 D = sPtrD [col];
1377
    
1378
2.07M
    A = Min_real32 (A, clipA);
1379
2.07M
    B = Min_real32 (B, clipB);
1380
2.07M
    C = Min_real32 (C, clipC);
1381
2.07M
    D = Min_real32 (D, clipD);
1382
    
1383
2.07M
    real32 r = m00 * A + m01 * B + m02 * C + m03 * D;
1384
2.07M
    real32 g = m10 * A + m11 * B + m12 * C + m13 * D;
1385
2.07M
    real32 b = m20 * A + m21 * B + m22 * C + m23 * D;
1386
    
1387
2.07M
    r = Pin_real32 (0.0f, r, 1.0f);
1388
2.07M
    g = Pin_real32 (0.0f, g, 1.0f);
1389
2.07M
    b = Pin_real32 (0.0f, b, 1.0f);
1390
    
1391
2.07M
    dPtrR [col] = r;
1392
2.07M
    dPtrG [col] = g;
1393
2.07M
    dPtrB [col] = b;
1394
    
1395
2.07M
    }
1396
  
1397
229k
  }
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
7.29M
  {
1637
  
1638
7.29M
  real32 m00 = (real32) matrix [0] [0];
1639
7.29M
  real32 m01 = (real32) matrix [0] [1];
1640
7.29M
  real32 m02 = (real32) matrix [0] [2];
1641
  
1642
311M
  for (uint32 col = 0; col < count; col++)
1643
303M
    {
1644
    
1645
303M
    real32 R = sPtrR [col];
1646
303M
    real32 G = sPtrG [col];
1647
303M
    real32 B = sPtrB [col];
1648
    
1649
303M
    real32 g = m00 * R + m01 * G + m02 * B;
1650
    
1651
303M
    g = Pin_real32 (0.0f, g, 1.0f);
1652
    
1653
303M
    dPtrG [col] = g;
1654
    
1655
303M
    }
1656
  
1657
7.29M
  }
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
38.0M
  {
1670
  
1671
38.0M
  real32 m00 = (real32) matrix [0] [0];
1672
38.0M
  real32 m01 = (real32) matrix [0] [1];
1673
38.0M
  real32 m02 = (real32) matrix [0] [2];
1674
  
1675
38.0M
  real32 m10 = (real32) matrix [1] [0];
1676
38.0M
  real32 m11 = (real32) matrix [1] [1];
1677
38.0M
  real32 m12 = (real32) matrix [1] [2];
1678
  
1679
38.0M
  real32 m20 = (real32) matrix [2] [0];
1680
38.0M
  real32 m21 = (real32) matrix [2] [1];
1681
38.0M
  real32 m22 = (real32) matrix [2] [2];
1682
  
1683
1.82G
  for (uint32 col = 0; col < count; col++)
1684
1.78G
    {
1685
    
1686
1.78G
    real32 R = sPtrR [col];
1687
1.78G
    real32 G = sPtrG [col];
1688
1.78G
    real32 B = sPtrB [col];
1689
    
1690
1.78G
    real32 r = m00 * R + m01 * G + m02 * B;
1691
1.78G
    real32 g = m10 * R + m11 * G + m12 * B;
1692
1.78G
    real32 b = m20 * R + m21 * G + m22 * B;
1693
    
1694
1.78G
    r = Pin_real32 (0.0f, r, 1.0f);
1695
1.78G
    g = Pin_real32 (0.0f, g, 1.0f);
1696
1.78G
    b = Pin_real32 (0.0f, b, 1.0f);
1697
    
1698
1.78G
    dPtrR [col] = r;
1699
1.78G
    dPtrG [col] = g;
1700
1.78G
    dPtrB [col] = b;
1701
    
1702
1.78G
    }
1703
  
1704
38.0M
  }
1705
1706
/*****************************************************************************/
1707
1708
void RefBaseline1DTable (const real32 *sPtr,
1709
             real32 *dPtr,
1710
             uint32 count,
1711
             const dng_1d_table &table)
1712
257M
  {
1713
1714
12.1G
  for (uint32 col = 0; col < count; col++)
1715
11.9G
    {
1716
    
1717
11.9G
    real32 x = sPtr [col];
1718
    
1719
11.9G
    real32 y = table.Interpolate (x);
1720
    
1721
11.9G
    dPtr [col] = y;
1722
    
1723
11.9G
    }
1724
  
1725
257M
  }
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
45.3M
  {
1738
1739
2.13G
  for (uint32 col = 0; col < count; col++)
1740
2.08G
    {
1741
    
1742
2.08G
    real32 r = sPtrR [col];
1743
2.08G
    real32 g = sPtrG [col];
1744
2.08G
    real32 b = sPtrB [col];
1745
    
1746
2.08G
    real32 rr;
1747
2.08G
    real32 gg;
1748
2.08G
    real32 bb;
1749
    
1750
2.08G
    #define RGBTone(r, g, b, rr, gg, bb)\
1751
2.08G
      {\
1752
50.6M
      \
1753
50.6M
      DNG_ASSERT (r >= g && g >= b && r > b, "Logic Error RGBTone");\
1754
50.6M
      \
1755
50.6M
      rr = table.Interpolate (r);\
1756
50.6M
      bb = table.Interpolate (b);\
1757
50.6M
      \
1758
50.6M
      gg = bb + ((rr - bb) * (g - b) / (r - b));\
1759
50.6M
      \
1760
50.6M
      }
1761
    
1762
2.08G
    if (r >= g)
1763
2.05G
      {
1764
      
1765
2.05G
      if (g > b)
1766
1.57M
        {
1767
        
1768
        // Case 1: r >= g > b
1769
        
1770
1.57M
        RGBTone (r, g, b, rr, gg, bb);
1771
        
1772
1.57M
        }
1773
          
1774
2.05G
      else if (b > r)
1775
2.57M
        {
1776
        
1777
        // Case 2: b > r >= g
1778
        
1779
2.57M
        RGBTone (b, r, g, bb, rr, gg);
1780
                
1781
2.57M
        }
1782
        
1783
2.05G
      else if (b > g)
1784
14.9M
        {
1785
        
1786
        // Case 3: r >= b > g
1787
        
1788
14.9M
        RGBTone (r, b, g, rr, bb, gg);
1789
        
1790
14.9M
        }
1791
        
1792
2.03G
      else
1793
2.03G
        {
1794
        
1795
        // Case 4: r >= g == b
1796
        
1797
2.03G
        DNG_ASSERT (r >= g && g == b, "Logic Error 2");
1798
        
1799
2.03G
        rr = table.Interpolate (r);
1800
2.03G
        gg = table.Interpolate (g);
1801
2.03G
        bb = gg;
1802
        
1803
2.03G
        }
1804
        
1805
2.05G
      }
1806
      
1807
31.5M
    else
1808
31.5M
      {
1809
      
1810
31.5M
      if (r >= b)
1811
3.70M
        {
1812
        
1813
        // Case 5: g > r >= b
1814
        
1815
3.70M
        RGBTone (g, r, b, gg, rr, bb);
1816
        
1817
3.70M
        }
1818
        
1819
27.8M
      else if (b > g)
1820
933k
        {
1821
        
1822
        // Case 6: b > g > r
1823
        
1824
933k
        RGBTone (b, g, r, bb, gg, rr);
1825
        
1826
933k
        }
1827
        
1828
26.8M
      else
1829
26.8M
        {
1830
        
1831
        // Case 7: g >= b > r
1832
        
1833
26.8M
        RGBTone (g, b, r, gg, bb, rr);
1834
        
1835
26.8M
        }
1836
      
1837
31.5M
      }
1838
      
1839
2.08G
    #undef RGBTone
1840
    
1841
2.08G
    dPtrR [col] = rr;
1842
2.08G
    dPtrG [col] = gg;
1843
2.08G
    dPtrB [col] = bb;
1844
    
1845
2.08G
    }
1846
  
1847
45.3M
  }
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
27.8M
  {
1859
  
1860
1.51G
  for (uint32 j = 0; j < sCount; j++)
1861
1.48G
    {
1862
    
1863
1.48G
    int32 total = 8192;
1864
    
1865
1.48G
    const uint16 *s = sPtr + j;
1866
    
1867
29.1G
    for (uint32 k = 0; k < wCount; k++)
1868
27.6G
      {
1869
      
1870
27.6G
      total += wPtr [k] * (int32) s [0];
1871
        
1872
27.6G
      s += sRowStep;
1873
        
1874
27.6G
      }
1875
      
1876
1.48G
    dPtr [j] = (uint16) Pin_int32 (0,
1877
1.48G
                     total >> 14,
1878
1.48G
                     pixelRange);
1879
1880
1.48G
    }
1881
    
1882
27.8M
  }
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
16.1M
  {
1893
  
1894
16.1M
  uint32 col;
1895
  
1896
  // Process first row.
1897
  
1898
16.1M
  real32 w = wPtr [0];
1899
                           
1900
1.42G
  for (col = 0; col < sCount; col++)
1901
1.40G
    {
1902
    
1903
1.40G
    dPtr [col] = w * sPtr [col];
1904
    
1905
1.40G
    }
1906
    
1907
16.1M
  sPtr += sRowStep;
1908
  
1909
  // Process middle rows.
1910
  
1911
89.5M
  for (uint32 j = 1; j < wCount - 1; j++)
1912
73.3M
    {
1913
    
1914
73.3M
    w = wPtr [j];
1915
                           
1916
10.1G
    for (col = 0; col < sCount; col++)
1917
10.0G
      {
1918
      
1919
10.0G
      dPtr [col] += w * sPtr [col];
1920
      
1921
10.0G
      }
1922
      
1923
73.3M
    sPtr += sRowStep;
1924
    
1925
73.3M
    }
1926
    
1927
  // Process last row.
1928
  
1929
16.1M
  w = wPtr [wCount - 1];
1930
  
1931
1.42G
  for (col = 0; col < sCount; col++)
1932
1.40G
    {
1933
    
1934
1.40G
    dPtr [col] = Pin_real32 (0.0f, 
1935
1.40G
                   dPtr [col] + w * sPtr [col],
1936
1.40G
                   1.0f);
1937
    
1938
1.40G
    }
1939
1940
16.1M
  }
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
27.8M
  {
1953
  
1954
974M
  for (uint32 j = 0; j < dCount; j++)
1955
946M
    {
1956
    
1957
946M
    int32 sCoord = coord [j];
1958
    
1959
946M
    int32 sFract = sCoord &  kResampleSubsampleMask;
1960
946M
    int32 sPixel = sCoord >> kResampleSubsampleBits;
1961
    
1962
946M
    const int16  *w = wPtr + sFract * wStep;
1963
946M
    const uint16 *s = sPtr + sPixel;
1964
    
1965
946M
    int32 total = w [0] * (int32) s [0];
1966
    
1967
5.73G
    for (uint32 k = 1; k < wCount; k++)
1968
4.78G
      {
1969
      
1970
4.78G
      total += w [k] * (int32) s [k];
1971
      
1972
4.78G
      }
1973
      
1974
946M
    dPtr [j] = (uint16) Pin_int32 (0,
1975
946M
                     (total + 8192) >> 14,
1976
946M
                     pixelRange);
1977
    
1978
946M
    }
1979
    
1980
27.8M
  }
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
16.1M
  {
1992
1993
885M
  for (uint32 j = 0; j < dCount; j++)
1994
869M
    {
1995
    
1996
869M
    int32 sCoord = coord [j];
1997
    
1998
869M
    int32 sFract = sCoord &  kResampleSubsampleMask;
1999
869M
    int32 sPixel = sCoord >> kResampleSubsampleBits;
2000
    
2001
869M
    const real32 *w = wPtr + sFract * wStep;
2002
869M
    const real32 *s = sPtr + sPixel;
2003
    
2004
869M
    real32 total = w [0] * s [0];
2005
    
2006
5.52G
    for (uint32 k = 1; k < wCount; k++)
2007
4.65G
      {
2008
      
2009
4.65G
      total += w [k] * s [k];
2010
      
2011
4.65G
      }
2012
      
2013
869M
    dPtr [j] = Pin_real32 (0.0f, total, 1.0f);
2014
    
2015
869M
    }
2016
    
2017
16.1M
  }
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
/*****************************************************************************/