OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #include "GrGLSLBlend.h" | 7 #include "GrGLSLBlend.h" |
8 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 8 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
9 | 9 |
10 ////////////////////////////////////////////////////////////////////////////// | 10 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 false); | 426 false); |
427 // append dst blend | 427 // append dst blend |
428 if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstC
olor, didAppend)) { | 428 if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstC
olor, didAppend)) { |
429 fsBuilder->codeAppend("vec4(0, 0, 0, 0)"); | 429 fsBuilder->codeAppend("vec4(0, 0, 0, 0)"); |
430 } | 430 } |
431 fsBuilder->codeAppend(";"); | 431 fsBuilder->codeAppend(";"); |
432 } else { | 432 } else { |
433 emit_advanced_xfermode_code(fsBuilder, srcColor, dstColor, outColor, mod
e); | 433 emit_advanced_xfermode_code(fsBuilder, srcColor, dstColor, outColor, mod
e); |
434 } | 434 } |
435 } | 435 } |
| 436 |
| 437 void GrGLSLBlend::AppendRegionOp(GrGLSLFragmentBuilder* fsBuilder, const char* s
rcColor, |
| 438 const char* dstColor, const char* outColor, |
| 439 SkRegion::Op regionOp) { |
| 440 SkXfermode::Coeff srcCoeff, dstCoeff; |
| 441 switch (regionOp) { |
| 442 case SkRegion::kReplace_Op: |
| 443 srcCoeff = SkXfermode::kOne_Coeff; |
| 444 dstCoeff = SkXfermode::kZero_Coeff; |
| 445 break; |
| 446 case SkRegion::kIntersect_Op: |
| 447 srcCoeff = SkXfermode::kDC_Coeff; |
| 448 dstCoeff = SkXfermode::kZero_Coeff; |
| 449 break; |
| 450 case SkRegion::kUnion_Op: |
| 451 srcCoeff = SkXfermode::kOne_Coeff; |
| 452 dstCoeff = SkXfermode::kISC_Coeff; |
| 453 break; |
| 454 case SkRegion::kXOR_Op: |
| 455 srcCoeff = SkXfermode::kIDC_Coeff; |
| 456 dstCoeff = SkXfermode::kISC_Coeff; |
| 457 break; |
| 458 case SkRegion::kDifference_Op: |
| 459 srcCoeff = SkXfermode::kZero_Coeff; |
| 460 dstCoeff = SkXfermode::kISC_Coeff; |
| 461 break; |
| 462 case SkRegion::kReverseDifference_Op: |
| 463 srcCoeff = SkXfermode::kIDC_Coeff; |
| 464 dstCoeff = SkXfermode::kZero_Coeff; |
| 465 break; |
| 466 default: |
| 467 SkFAIL("Unsupported Op"); |
| 468 // We should never get here but to make compiler happy |
| 469 srcCoeff = SkXfermode::kZero_Coeff; |
| 470 dstCoeff = SkXfermode::kZero_Coeff; |
| 471 } |
| 472 fsBuilder->codeAppendf("%s = ", outColor); |
| 473 // append src blend |
| 474 bool didAppend = append_porterduff_term(fsBuilder, srcCoeff, srcColor, srcCo
lor, dstColor, |
| 475 false); |
| 476 // append dst blend |
| 477 if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor
, didAppend)) { |
| 478 fsBuilder->codeAppend("vec4(0, 0, 0, 0)"); |
| 479 } |
| 480 fsBuilder->codeAppend(";"); |
| 481 } |
| 482 |
OLD | NEW |