• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkColorLookUpTable_DEFINED
9 #define SkColorLookUpTable_DEFINED
10 
11 #include "SkRefCnt.h"
12 #include "SkTemplates.h"
13 
14 static constexpr uint8_t kMaxColorChannels = 4;
15 
16 class SkColorLookUpTable : public SkRefCnt {
17 public:
18     static constexpr uint8_t kOutputChannels = 3;
19 
SkColorLookUpTable(uint8_t inputChannels,const uint8_t gridPoints[kMaxColorChannels])20     SkColorLookUpTable(uint8_t inputChannels, const uint8_t gridPoints[kMaxColorChannels])
21         : fInputChannels(inputChannels) {
22         SkASSERT(inputChannels >= 1 && inputChannels <= kMaxColorChannels);
23         memcpy(fGridPoints, gridPoints, fInputChannels * sizeof(uint8_t));
24     }
25 
26     /**
27      *  If fInputChannels == kOutputChannels == 3, performs tetrahedral interpolation, otherwise
28      *  performs multilinear interpolation (ie LERP for n =1, bilinear for n=2, trilinear for n=3)
29      *  with fInputChannels input dimensions and kOutputChannels output dimensions.
30      *  |dst| can be |src| only when fInputChannels == kOutputChannels == 3
31      *  |dst| is the destination pixel, must have at least kOutputChannels elements.
32      *  |src| is the source pixel, must have at least fInputChannels elements.
33      */
34     void interp(float* dst, const float* src) const;
35 
inputChannels()36     int inputChannels() const { return fInputChannels; }
37 
outputChannels()38     int outputChannels() const { return kOutputChannels; }
39 
gridPoints(int dimension)40     int gridPoints(int dimension) const {
41         SkASSERT(dimension >= 0 && dimension < inputChannels());
42         return fGridPoints[dimension];
43     }
44 
45 private:
table()46     const float* table() const {
47         return SkTAddOffset<const float>(this, sizeof(SkColorLookUpTable));
48     }
49 
50     /**
51      *  Performs tetrahedral interpolation with 3 input and 3 output dimensions.
52      *  |dst| can be |src|
53      */
54     void interp3D(float* dst, const float* src) const;
55 
56     // recursively LERPs one dimension at a time. Used by interp() for the general case
57     float interpDimension(const float* src, int inputDimension, int outputDimension,
58                           int index[kMaxColorChannels]) const;
59 
60     uint8_t fInputChannels;
61     uint8_t fGridPoints[kMaxColorChannels];
62 
63 public:
64     // Objects of this type are created in a custom fashion using sk_malloc_throw
65     // and therefore must be sk_freed.
66     void* operator new(size_t size) = delete;
new(size_t,void * p)67     void* operator new(size_t, void* p) { return p; }
delete(void * p)68     void operator delete(void* p) { sk_free(p); }
69 };
70 
71 #endif
72