Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: src/core/SkLinearBitmapPipeline_sample.h

Issue 2166623002: Fix color order for 565,4444, and I8 samplers. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkLinearBitmapPipeline_sampler_DEFINED 8 #ifndef SkLinearBitmapPipeline_sampler_DEFINED
9 #define SkLinearBitmapPipeline_sampler_DEFINED 9 #define SkLinearBitmapPipeline_sampler_DEFINED
10 10
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 70
71 Sk4f toSk4f(const Element pixel) const { 71 Sk4f toSk4f(const Element pixel) const {
72 return fTintColor * (pixel * (1.0f/255.0f)); 72 return fTintColor * (pixel * (1.0f/255.0f));
73 } 73 }
74 74
75 private: 75 private:
76 const Sk4f fTintColor; 76 const Sk4f fTintColor;
77 }; 77 };
78 78
79 template <SkGammaType gammaType> 79 template <SkGammaType gammaType>
80 static inline Sk4f pmcolor_to_rgba(SkPMColor pixel) {
81 return swizzle_rb_if_bgra(
82 (gammaType == kSRGB_SkGammaType) ? Sk4f_fromS32(pixel)
83 : Sk4f_fromL32(pixel));
84 }
85
86 template <SkGammaType gammaType>
80 class PixelConverter<kRGB_565_SkColorType, gammaType> { 87 class PixelConverter<kRGB_565_SkColorType, gammaType> {
81 public: 88 public:
82 using Element = uint16_t; 89 using Element = uint16_t;
83 PixelConverter(const SkPixmap& srcPixmap) { } 90 PixelConverter(const SkPixmap& srcPixmap) { }
84 91
85 Sk4f toSk4f(Element pixel) const { 92 Sk4f toSk4f(Element pixel) const {
86 SkPMColor pixel32 = SkPixel16ToPixel32(pixel); 93 return pmcolor_to_rgba<gammaType>(SkPixel16ToPixel32(pixel));
87 return gammaType == kSRGB_SkGammaType
88 ? Sk4f_fromS32(pixel32)
89 : Sk4f_fromL32(pixel32);
90 } 94 }
91 }; 95 };
92 96
93 template <SkGammaType gammaType> 97 template <SkGammaType gammaType>
94 class PixelConverter<kARGB_4444_SkColorType, gammaType> { 98 class PixelConverter<kARGB_4444_SkColorType, gammaType> {
95 public: 99 public:
96 using Element = uint16_t; 100 using Element = uint16_t;
97 PixelConverter(const SkPixmap& srcPixmap) { } 101 PixelConverter(const SkPixmap& srcPixmap) { }
98 102
99 Sk4f toSk4f(Element pixel) const { 103 Sk4f toSk4f(Element pixel) const {
100 SkPMColor pixel32 = SkPixel4444ToPixel32(pixel); 104 return pmcolor_to_rgba<gammaType>(SkPixel4444ToPixel32(pixel));
101 return gammaType == kSRGB_SkGammaType
102 ? Sk4f_fromS32(pixel32)
103 : Sk4f_fromL32(pixel32);
104 } 105 }
105 }; 106 };
106 107
107 template <SkGammaType gammaType> 108 template <SkGammaType gammaType>
108 class PixelConverter<kRGBA_8888_SkColorType, gammaType> { 109 class PixelConverter<kRGBA_8888_SkColorType, gammaType> {
109 public: 110 public:
110 using Element = uint32_t; 111 using Element = uint32_t;
111 PixelConverter(const SkPixmap& srcPixmap) { } 112 PixelConverter(const SkPixmap& srcPixmap) { }
112 113
113 Sk4f toSk4f(Element pixel) const { 114 Sk4f toSk4f(Element pixel) const {
(...skipping 18 matching lines...) Expand all
132 template <SkGammaType gammaType> 133 template <SkGammaType gammaType>
133 class PixelConverter<kIndex_8_SkColorType, gammaType> { 134 class PixelConverter<kIndex_8_SkColorType, gammaType> {
134 public: 135 public:
135 using Element = uint8_t; 136 using Element = uint8_t;
136 PixelConverter(const SkPixmap& srcPixmap) { 137 PixelConverter(const SkPixmap& srcPixmap) {
137 SkColorTable* skColorTable = srcPixmap.ctable(); 138 SkColorTable* skColorTable = srcPixmap.ctable();
138 SkASSERT(skColorTable != nullptr); 139 SkASSERT(skColorTable != nullptr);
139 140
140 fColorTable = (Sk4f*)SkAlign16((intptr_t)fColorTableStorage.get()); 141 fColorTable = (Sk4f*)SkAlign16((intptr_t)fColorTableStorage.get());
141 for (int i = 0; i < skColorTable->count(); i++) { 142 for (int i = 0; i < skColorTable->count(); i++) {
142 fColorTable[i] = this->convertPixel((*skColorTable)[i]); 143 fColorTable[i] = pmcolor_to_rgba<gammaType>((*skColorTable)[i]);
143 } 144 }
144 } 145 }
145 146
146 PixelConverter(const PixelConverter& strategy) { 147 PixelConverter(const PixelConverter& strategy) {
147 fColorTable = (Sk4f*)SkAlign16((intptr_t)fColorTableStorage.get()); 148 fColorTable = (Sk4f*)SkAlign16((intptr_t)fColorTableStorage.get());
148 // TODO: figure out the count. 149 // TODO: figure out the count.
149 for (int i = 0; i < 256; i++) { 150 for (int i = 0; i < 256; i++) {
150 fColorTable[i] = strategy.fColorTable[i]; 151 fColorTable[i] = strategy.fColorTable[i];
151 } 152 }
152 } 153 }
153 154
154 Sk4f toSk4f(Element index) const { 155 Sk4f toSk4f(Element index) const {
155 return fColorTable[index]; 156 return fColorTable[index];
156 } 157 }
157 158
158 private: 159 private:
159 static const size_t kColorTableSize = sizeof(Sk4f[256]) + 12; 160 static const size_t kColorTableSize = sizeof(Sk4f[256]) + 12;
160 Sk4f convertPixel(SkPMColor pmColor) { 161
161 Sk4f pixel = to_4f(pmColor);
162 float alpha = get_alpha(pixel);
163 if (alpha != 0.0f) {
164 float invAlpha = 1.0f / alpha;
165 Sk4f normalize = {invAlpha, invAlpha, invAlpha, 1.0f / 255.0f};
166 pixel = pixel * normalize;
167 if (gammaType == kSRGB_SkGammaType) {
168 pixel = linear_to_srgb(pixel);
169 }
170 return pixel;
171 } else {
172 return Sk4f{0.0f};
173 }
174 }
175 SkAutoMalloc fColorTableStorage{kColorTableSize}; 162 SkAutoMalloc fColorTableStorage{kColorTableSize};
176 Sk4f* fColorTable; 163 Sk4f* fColorTable;
177 }; 164 };
178 165
179 template <SkGammaType gammaType> 166 template <SkGammaType gammaType>
180 class PixelConverter<kGray_8_SkColorType, gammaType> { 167 class PixelConverter<kGray_8_SkColorType, gammaType> {
181 public: 168 public:
182 using Element = uint8_t; 169 using Element = uint8_t;
183 PixelConverter(const SkPixmap& srcPixmap) { } 170 PixelConverter(const SkPixmap& srcPixmap) { }
184 171
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 } 825 }
839 } 826 }
840 827
841 Next* const fNext; 828 Next* const fNext;
842 Accessor fAccessor; 829 Accessor fAccessor;
843 }; 830 };
844 831
845 } // namespace 832 } // namespace
846 833
847 #endif // SkLinearBitmapPipeline_sampler_DEFINED 834 #endif // SkLinearBitmapPipeline_sampler_DEFINED
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698