OLD | NEW |
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 "SkPixelXorXfermode.h" | 8 #include "SkPixelXorXfermode.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkReadBuffer.h" | 10 #include "SkReadBuffer.h" |
11 #include "SkWriteBuffer.h" | 11 #include "SkWriteBuffer.h" |
12 #include "SkString.h" | 12 #include "SkString.h" |
13 #include "SkValue.h" | |
14 #include "SkValueKeys.h" | |
15 | 13 |
16 // we always return an opaque color, 'cause I don't know what to do with | 14 // we always return an opaque color, 'cause I don't know what to do with |
17 // the alpha-component and still return a valid premultiplied color. | 15 // the alpha-component and still return a valid premultiplied color. |
18 SkPMColor SkPixelXorXfermode::xferColor(SkPMColor src, SkPMColor dst) const { | 16 SkPMColor SkPixelXorXfermode::xferColor(SkPMColor src, SkPMColor dst) const { |
19 SkPMColor res = src ^ dst ^ fOpColor; | 17 SkPMColor res = src ^ dst ^ fOpColor; |
20 | 18 |
21 res |= (SK_A32_MASK << SK_A32_SHIFT); // force it to be opaque | 19 res |= (SK_A32_MASK << SK_A32_SHIFT); // force it to be opaque |
22 return res; | 20 return res; |
23 } | 21 } |
24 | 22 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 const char* opColor) { | 57 const char* opColor) { |
60 static const GrGLSLShaderVar gXorArgs[] = { | 58 static const GrGLSLShaderVar gXorArgs[] = { |
61 GrGLSLShaderVar("f1", kFloat_GrSLType), | 59 GrGLSLShaderVar("f1", kFloat_GrSLType), |
62 GrGLSLShaderVar("f2", kFloat_GrSLType), | 60 GrGLSLShaderVar("f2", kFloat_GrSLType), |
63 GrGLSLShaderVar("f3", kFloat_GrSLType), | 61 GrGLSLShaderVar("f3", kFloat_GrSLType), |
64 GrGLSLShaderVar("fPowerOf2Divisor", kFloat_GrSLType), | 62 GrGLSLShaderVar("fPowerOf2Divisor", kFloat_GrSLType), |
65 }; | 63 }; |
66 SkString xorFuncName; | 64 SkString xorFuncName; |
67 | 65 |
68 // The xor function checks if the three passed in floats (f1, f2, f3) would | 66 // The xor function checks if the three passed in floats (f1, f2, f3) would |
69 // have a bit in the log2(fPowerOf2Divisor)-th position if they were | 67 // have a bit in the log2(fPowerOf2Divisor)-th position if they were |
70 // represented by an int. It then performs an xor of the 3 bits (using | 68 // represented by an int. It then performs an xor of the 3 bits (using |
71 // the property that serial xors can be treated as a sum of 0s & 1s mod 2). | 69 // the property that serial xors can be treated as a sum of 0s & 1s mod 2). |
72 fragBuilder->emitFunction(kFloat_GrSLType, | 70 fragBuilder->emitFunction(kFloat_GrSLType, |
73 "xor", | 71 "xor", |
74 SK_ARRAY_COUNT(gXorArgs), | 72 SK_ARRAY_COUNT(gXorArgs), |
75 gXorArgs, | 73 gXorArgs, |
76 "float bit1 = floor(f1 / fPowerOf2Divisor);" | 74 "float bit1 = floor(f1 / fPowerOf2Divisor);" |
77 "float bit2 = floor(f2 / fPowerOf2Divisor);" | 75 "float bit2 = floor(f2 / fPowerOf2Divisor);" |
78 "float bit3 = floor(f3 / fPowerOf2Divisor);" | 76 "float bit3 = floor(f3 / fPowerOf2Divisor);" |
79 "return mod(bit1 + bit2 + bit3, 2.0);", | 77 "return mod(bit1 + bit2 + bit3, 2.0);", |
80 &xorFuncName); | 78 &xorFuncName); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 add_pixelxor_code(fragBuilder, srcColor, dstColor, outColor, kOpColorUni
); | 289 add_pixelxor_code(fragBuilder, srcColor, dstColor, outColor, kOpColorUni
); |
292 | 290 |
293 // Apply coverage. | 291 // Apply coverage. |
294 INHERITED::DefaultCoverageModulation(fragBuilder, srcCoverage, dstColor,
outColor, | 292 INHERITED::DefaultCoverageModulation(fragBuilder, srcCoverage, dstColor,
outColor, |
295 outColorSecondary, proc); | 293 outColorSecondary, proc); |
296 } | 294 } |
297 | 295 |
298 void onSetData(const GrGLSLProgramDataManager& pdman, | 296 void onSetData(const GrGLSLProgramDataManager& pdman, |
299 const GrXferProcessor& processor) override { | 297 const GrXferProcessor& processor) override { |
300 const PixelXorXP& pixelXor = processor.cast<PixelXorXP>(); | 298 const PixelXorXP& pixelXor = processor.cast<PixelXorXP>(); |
301 pdman.set3f(fOpColorUni, | 299 pdman.set3f(fOpColorUni, |
302 SkColorGetR(pixelXor.opColor())/255.0f, | 300 SkColorGetR(pixelXor.opColor())/255.0f, |
303 SkColorGetG(pixelXor.opColor())/255.0f, | 301 SkColorGetG(pixelXor.opColor())/255.0f, |
304 SkColorGetB(pixelXor.opColor())/255.0f); | 302 SkColorGetB(pixelXor.opColor())/255.0f); |
305 }; | 303 }; |
306 | 304 |
307 GrGLSLProgramDataManager::UniformHandle fOpColorUni; | 305 GrGLSLProgramDataManager::UniformHandle fOpColorUni; |
308 | 306 |
309 typedef GrGLSLXferProcessor INHERITED; | 307 typedef GrGLSLXferProcessor INHERITED; |
310 }; | 308 }; |
311 | 309 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 } | 379 } |
382 | 380 |
383 bool SkPixelXorXfermode::asXPFactory(GrXPFactory** xpf) const { | 381 bool SkPixelXorXfermode::asXPFactory(GrXPFactory** xpf) const { |
384 if (xpf) { | 382 if (xpf) { |
385 *xpf = GrPixelXorXPFactory::Create(fOpColor); | 383 *xpf = GrPixelXorXPFactory::Create(fOpColor); |
386 } | 384 } |
387 return true; | 385 return true; |
388 } | 386 } |
389 | 387 |
390 #endif | 388 #endif |
391 | |
392 SkValue SkPixelXorXfermode::asValue() const { | |
393 auto value = SkValue::Object(SkValue::PixelXorXfermode); | |
394 value.set(SkValueKeys::PixelXorXfermode::kOpColor, | |
395 SkValue::FromU32(SkToU32(fOpColor))); | |
396 return value; | |
397 } | |
OLD | NEW |