| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 "SkGr.h" | 8 #include "SkGr.h" |
| 9 #include "SkColorFilter.h" | 9 #include "SkColorFilter.h" |
| 10 #include "SkConfig8888.h" | 10 #include "SkConfig8888.h" |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 return false; | 409 return false; |
| 410 } | 410 } |
| 411 if (ctOut) { | 411 if (ctOut) { |
| 412 *ctOut = ct; | 412 *ctOut = ct; |
| 413 } | 413 } |
| 414 return true; | 414 return true; |
| 415 } | 415 } |
| 416 | 416 |
| 417 /////////////////////////////////////////////////////////////////////////////// | 417 /////////////////////////////////////////////////////////////////////////////// |
| 418 | 418 |
| 419 void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, bool ju
stAlpha, | 419 void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, GrColor
grColor, |
| 420 bool constantColor, GrPaint* grPaint) { | 420 bool constantColor, GrPaint* grPaint) { |
| 421 | 421 |
| 422 grPaint->setDither(skPaint.isDither()); | 422 grPaint->setDither(skPaint.isDither()); |
| 423 grPaint->setAntiAlias(skPaint.isAntiAlias()); | 423 grPaint->setAntiAlias(skPaint.isAntiAlias()); |
| 424 | 424 |
| 425 SkXfermode::Coeff sm; | 425 SkXfermode::Coeff sm; |
| 426 SkXfermode::Coeff dm; | 426 SkXfermode::Coeff dm; |
| 427 | 427 |
| 428 SkXfermode* mode = skPaint.getXfermode(); | 428 SkXfermode* mode = skPaint.getXfermode(); |
| 429 GrEffectRef* xferEffect = NULL; | 429 GrEffectRef* xferEffect = NULL; |
| 430 if (SkXfermode::AsNewEffectOrCoeff(mode, &xferEffect, &sm, &dm)) { | 430 if (SkXfermode::AsNewEffectOrCoeff(mode, &xferEffect, &sm, &dm)) { |
| 431 if (NULL != xferEffect) { | 431 if (NULL != xferEffect) { |
| 432 grPaint->addColorEffect(xferEffect)->unref(); | 432 grPaint->addColorEffect(xferEffect)->unref(); |
| 433 sm = SkXfermode::kOne_Coeff; | 433 sm = SkXfermode::kOne_Coeff; |
| 434 dm = SkXfermode::kZero_Coeff; | 434 dm = SkXfermode::kZero_Coeff; |
| 435 } | 435 } |
| 436 } else { | 436 } else { |
| 437 //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");) | 437 //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");) |
| 438 // Fall back to src-over | 438 // Fall back to src-over |
| 439 sm = SkXfermode::kOne_Coeff; | 439 sm = SkXfermode::kOne_Coeff; |
| 440 dm = SkXfermode::kISA_Coeff; | 440 dm = SkXfermode::kISA_Coeff; |
| 441 } | 441 } |
| 442 grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm)); | 442 grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm)); |
| 443 | 443 |
| 444 if (justAlpha) { | 444 //set the color of the paint to the one of the parameter |
| 445 uint8_t alpha = skPaint.getAlpha(); | 445 grPaint->setColor(grColor); |
| 446 grPaint->setColor(GrColorPackRGBA(alpha, alpha, alpha, alpha)); | |
| 447 // justAlpha is currently set to true only if there is a texture, | |
| 448 // so constantColor should not also be true. | |
| 449 SkASSERT(!constantColor); | |
| 450 } else { | |
| 451 grPaint->setColor(SkColor2GrColor(skPaint.getColor())); | |
| 452 } | |
| 453 | 446 |
| 454 SkColorFilter* colorFilter = skPaint.getColorFilter(); | 447 SkColorFilter* colorFilter = skPaint.getColorFilter(); |
| 455 if (NULL != colorFilter) { | 448 if (NULL != colorFilter) { |
| 456 // if the source color is a constant then apply the filter here once rat
her than per pixel | 449 // if the source color is a constant then apply the filter here once rat
her than per pixel |
| 457 // in a shader. | 450 // in a shader. |
| 458 if (constantColor) { | 451 if (constantColor) { |
| 459 SkColor filtered = colorFilter->filterColor(skPaint.getColor()); | 452 SkColor filtered = colorFilter->filterColor(skPaint.getColor()); |
| 460 grPaint->setColor(SkColor2GrColor(filtered)); | 453 grPaint->setColor(SkColor2GrColor(filtered)); |
| 461 } else { | 454 } else { |
| 462 SkAutoTUnref<GrEffectRef> effect(colorFilter->asNewEffect(context)); | 455 SkAutoTUnref<GrEffectRef> effect(colorFilter->asNewEffect(context)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 484 } | 477 } |
| 485 private: | 478 private: |
| 486 GrContext* fContext; | 479 GrContext* fContext; |
| 487 SkMatrix fMatrix; | 480 SkMatrix fMatrix; |
| 488 }; | 481 }; |
| 489 | 482 |
| 490 void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint, | 483 void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint, |
| 491 bool constantColor, GrPaint* grPaint) { | 484 bool constantColor, GrPaint* grPaint) { |
| 492 SkShader* shader = skPaint.getShader(); | 485 SkShader* shader = skPaint.getShader(); |
| 493 if (NULL == shader) { | 486 if (NULL == shader) { |
| 494 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPaint)
; | 487 SkPaint2GrPaintNoShader(context, skPaint, SkColor2GrColor(skPaint.getCol
or()), |
| 488 constantColor, grPaint); |
| 495 return; | 489 return; |
| 496 } | 490 } |
| 497 | 491 |
| 498 // SkShader::asNewEffect() may do offscreen rendering. Save off the current
RT, clip, and | 492 // SkShader::asNewEffect() may do offscreen rendering. Save off the current
RT, clip, and |
| 499 // matrix. We don't reset the matrix on the context because SkShader::asNewE
ffect may use | 493 // matrix. We don't reset the matrix on the context because SkShader::asNewE
ffect may use |
| 500 // GrContext::getMatrix() to know the transformation from local coords to de
vice space. | 494 // GrContext::getMatrix() to know the transformation from local coords to de
vice space. |
| 501 GrContext::AutoRenderTarget art(context, NULL); | 495 GrContext::AutoRenderTarget art(context, NULL); |
| 502 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialClip); | 496 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialClip); |
| 503 AutoMatrix am(context); | 497 AutoMatrix am(context); |
| 504 | 498 |
| 505 // setup the shader as the first color effect on the paint | 499 // setup the shader as the first color effect on the paint |
| 506 SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(context, skPaint, NULL)
); | 500 // the default grColor is the paint's color |
| 507 if (NULL != effect.get()) { | 501 GrColor grColor = SkColor2GrColor(skPaint.getColor()); |
| 502 GrEffectRef* grEffect = NULL; |
| 503 if (shader->asNewEffect(context, skPaint, NULL, &grColor, &grEffect) && NULL
!= grEffect) { |
| 504 SkAutoTUnref<GrEffectRef> effect(grEffect); |
| 508 grPaint->addColorEffect(effect); | 505 grPaint->addColorEffect(effect); |
| 509 // Now setup the rest of the paint. | 506 constantColor = false; |
| 510 SkPaint2GrPaintNoShader(context, skPaint, true, false, grPaint); | |
| 511 } else { | |
| 512 // We still don't have SkColorShader::asNewEffect() implemented. | |
| 513 SkShader::GradientInfo info; | |
| 514 SkColor color; | |
| 515 | |
| 516 info.fColors = &color; | |
| 517 info.fColorOffsets = NULL; | |
| 518 info.fColorCount = 1; | |
| 519 if (SkShader::kColor_GradientType == shader->asAGradient(&info)) { | |
| 520 SkPaint copy(skPaint); | |
| 521 copy.setShader(NULL); | |
| 522 // modulate the paint alpha by the shader's solid color alpha | |
| 523 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha()); | |
| 524 copy.setColor(SkColorSetA(color, newA)); | |
| 525 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint
); | |
| 526 } else { | |
| 527 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPa
int); | |
| 528 } | |
| 529 } | 507 } |
| 508 // The grcolor is automatically set when calling asneweffect. |
| 509 // If the shader can be seen as an effect it returns true and adds its effec
t to the grpaint. |
| 510 SkPaint2GrPaintNoShader(context, skPaint, grColor, constantColor, grPaint); |
| 530 } | 511 } |
| OLD | NEW |