Line data Source code
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 0 : class SkColorLookUpTable : public SkRefCnt {
17 : public:
18 : static constexpr uint8_t kOutputChannels = 3;
19 :
20 0 : SkColorLookUpTable(uint8_t inputChannels, const uint8_t gridPoints[kMaxColorChannels])
21 0 : : fInputChannels(inputChannels) {
22 0 : SkASSERT(inputChannels >= 1 && inputChannels <= kMaxColorChannels);
23 0 : memcpy(fGridPoints, gridPoints, fInputChannels * sizeof(uint8_t));
24 0 : }
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 :
36 0 : int inputChannels() const { return fInputChannels; }
37 :
38 0 : int outputChannels() const { return kOutputChannels; }
39 :
40 : int gridPoints(int dimension) const {
41 : SkASSERT(dimension >= 0 && dimension < inputChannels());
42 : return fGridPoints[dimension];
43 : }
44 :
45 : private:
46 0 : const float* table() const {
47 0 : 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;
67 0 : void* operator new(size_t, void* p) { return p; }
68 0 : void operator delete(void* p) { sk_free(p); }
69 : };
70 :
71 : #endif
|