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

Side by Side Diff: src/effects/SkColorMatrixFilter.cpp

Issue 1022673007: Revert of remove colorfilter native-565 support. complicating w/ no real value. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 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 | « src/effects/SkColorFilters.cpp ('k') | 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 2011 Google Inc. 2 * Copyright 2011 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 #include "SkColorMatrixFilter.h" 8 #include "SkColorMatrixFilter.h"
9 #include "SkColorMatrix.h" 9 #include "SkColorMatrix.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 unsigned r, unsigned g, unsigned b, unsigned a, 130 unsigned r, unsigned g, unsigned b, unsigned a,
131 int32_t* SK_RESTRICT result) { 131 int32_t* SK_RESTRICT result) {
132 const int32_t* SK_RESTRICT array = state.fArray; 132 const int32_t* SK_RESTRICT array = state.fArray;
133 133
134 result[0] = r + (array[SkColorMatrix::kR_Trans] >> 16); 134 result[0] = r + (array[SkColorMatrix::kR_Trans] >> 16);
135 result[1] = g + (array[SkColorMatrix::kG_Trans] >> 16); 135 result[1] = g + (array[SkColorMatrix::kG_Trans] >> 16);
136 result[2] = b + (array[SkColorMatrix::kB_Trans] >> 16); 136 result[2] = b + (array[SkColorMatrix::kB_Trans] >> 16);
137 result[3] = a; 137 result[3] = a;
138 } 138 }
139 139
140 #define kNO_ALPHA_FLAGS (SkColorFilter::kAlphaUnchanged_Flag | \
141 SkColorFilter::kHasFilter16_Flag)
142
140 // src is [20] but some compilers won't accept __restrict__ on anything 143 // src is [20] but some compilers won't accept __restrict__ on anything
141 // but an raw pointer or reference 144 // but an raw pointer or reference
142 void SkColorMatrixFilter::initState(const SkScalar* SK_RESTRICT src) { 145 void SkColorMatrixFilter::initState(const SkScalar* SK_RESTRICT src) {
143 transpose_to_pmorder(fTranspose, src); 146 transpose_to_pmorder(fTranspose, src);
144 147
145 int32_t* array = fState.fArray; 148 int32_t* array = fState.fArray;
146 SkFixed max = 0; 149 SkFixed max = 0;
147 for (int i = 0; i < 20; i++) { 150 for (int i = 0; i < 20; i++) {
148 SkFixed value = SkScalarToFixed(src[i]); 151 SkFixed value = SkScalarToFixed(src[i]);
149 array[i] = value; 152 array[i] = value;
(...skipping 21 matching lines...) Expand all
171 // check if we have to munge Alpha 174 // check if we have to munge Alpha
172 int32_t changesAlpha = (array[15] | array[16] | array[17] | 175 int32_t changesAlpha = (array[15] | array[16] | array[17] |
173 (array[18] - one) | array[19]); 176 (array[18] - one) | array[19]);
174 int32_t usesAlpha = (array[3] | array[8] | array[13]); 177 int32_t usesAlpha = (array[3] | array[8] | array[13]);
175 bool shiftIs16 = (16 == fState.fShift); 178 bool shiftIs16 = (16 == fState.fShift);
176 179
177 if (changesAlpha | usesAlpha) { 180 if (changesAlpha | usesAlpha) {
178 fProc = shiftIs16 ? General16 : General; 181 fProc = shiftIs16 ? General16 : General;
179 fFlags = changesAlpha ? 0 : SkColorFilter::kAlphaUnchanged_Flag; 182 fFlags = changesAlpha ? 0 : SkColorFilter::kAlphaUnchanged_Flag;
180 } else { 183 } else {
181 fFlags = SkColorFilter::kAlphaUnchanged_Flag; 184 fFlags = kNO_ALPHA_FLAGS;
182 185
183 int32_t needsScale = (array[SkColorMatrix::kR_Scale] - one) | 186 int32_t needsScale = (array[SkColorMatrix::kR_Scale] - one) |
184 (array[SkColorMatrix::kG_Scale] - one) | 187 (array[SkColorMatrix::kG_Scale] - one) |
185 (array[SkColorMatrix::kB_Scale] - one); 188 (array[SkColorMatrix::kB_Scale] - one);
186 189
187 int32_t needs3x3 = array[1] | array[2] | // red off-axis 190 int32_t needs3x3 = array[1] | array[2] | // red off-axis
188 array[5] | array[7] | // green off-axis 191 array[5] | array[7] | // green off-axis
189 array[10] | array[11]; // blue off-axis 192 array[10] | array[11]; // blue off-axis
190 193
191 if (needs3x3) { 194 if (needs3x3) {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 r = pin(result[0], SK_R32_MASK); 356 r = pin(result[0], SK_R32_MASK);
354 g = pin(result[1], SK_G32_MASK); 357 g = pin(result[1], SK_G32_MASK);
355 b = pin(result[2], SK_B32_MASK); 358 b = pin(result[2], SK_B32_MASK);
356 a = pin(result[3], SK_A32_MASK); 359 a = pin(result[3], SK_A32_MASK);
357 // re-prepremultiply if needed 360 // re-prepremultiply if needed
358 dst[i] = SkPremultiplyARGBInline(a, r, g, b); 361 dst[i] = SkPremultiplyARGBInline(a, r, g, b);
359 } 362 }
360 } 363 }
361 } 364 }
362 365
366 void SkColorMatrixFilter::filterSpan16(const uint16_t src[], int count,
367 uint16_t dst[]) const {
368 SkASSERT(fFlags & SkColorFilter::kHasFilter16_Flag);
369
370 Proc proc = fProc;
371 const State& state = fState;
372 int32_t result[4];
373
374 if (NULL == proc) {
375 if (src != dst) {
376 memcpy(dst, src, count * sizeof(uint16_t));
377 }
378 return;
379 }
380
381 for (int i = 0; i < count; i++) {
382 uint16_t c = src[i];
383
384 // expand to 8bit components (since our matrix translate is 8bit biased
385 unsigned r = SkPacked16ToR32(c);
386 unsigned g = SkPacked16ToG32(c);
387 unsigned b = SkPacked16ToB32(c);
388
389 proc(state, r, g, b, 0, result);
390
391 r = pin(result[0], SK_R32_MASK);
392 g = pin(result[1], SK_G32_MASK);
393 b = pin(result[2], SK_B32_MASK);
394
395 // now packed it back down to 16bits (hmmm, could dither...)
396 dst[i] = SkPack888ToRGB16(r, g, b);
397 }
398 }
399
363 /////////////////////////////////////////////////////////////////////////////// 400 ///////////////////////////////////////////////////////////////////////////////
364 401
365 void SkColorMatrixFilter::flatten(SkWriteBuffer& buffer) const { 402 void SkColorMatrixFilter::flatten(SkWriteBuffer& buffer) const {
366 SkASSERT(sizeof(fMatrix.fMat)/sizeof(SkScalar) == 20); 403 SkASSERT(sizeof(fMatrix.fMat)/sizeof(SkScalar) == 20);
367 buffer.writeScalarArray(fMatrix.fMat, 20); 404 buffer.writeScalarArray(fMatrix.fMat, 20);
368 } 405 }
369 406
370 SkFlattenable* SkColorMatrixFilter::CreateProc(SkReadBuffer& buffer) { 407 SkFlattenable* SkColorMatrixFilter::CreateProc(SkReadBuffer& buffer) {
371 SkColorMatrix matrix; 408 SkColorMatrix matrix;
372 if (buffer.readScalarArray(matrix.fMat, 20)) { 409 if (buffer.readScalarArray(matrix.fMat, 20)) {
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 str->append("matrix: ("); 612 str->append("matrix: (");
576 for (int i = 0; i < 20; ++i) { 613 for (int i = 0; i < 20; ++i) {
577 str->appendScalar(fMatrix.fMat[i]); 614 str->appendScalar(fMatrix.fMat[i]);
578 if (i < 19) { 615 if (i < 19) {
579 str->append(", "); 616 str->append(", ");
580 } 617 }
581 } 618 }
582 str->append(")"); 619 str->append(")");
583 } 620 }
584 #endif 621 #endif
OLDNEW
« no previous file with comments | « src/effects/SkColorFilters.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698