| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index 0aee983f7561eaa852059b04d0d21f88d39b043f..338cb156a57d937b1bddbaf92dff12603f063b8a 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -20,7 +20,6 @@
|
| #include "SkGrTexturePixelRef.h"
|
|
|
| #include "SkBounder.h"
|
| -#include "SkColorFilter.h"
|
| #include "SkDeviceImageFilterProxy.h"
|
| #include "SkDrawProcs.h"
|
| #include "SkGlyphCache.h"
|
| @@ -377,119 +376,6 @@ SK_COMPILE_ASSERT(SkShader::kTwoPointConical_BitmapType == 5,
|
| SK_COMPILE_ASSERT(SkShader::kLinear_BitmapType == 6, shader_type_mismatch);
|
| SK_COMPILE_ASSERT(SkShader::kLast_BitmapType == 6, shader_type_mismatch);
|
|
|
| -namespace {
|
| -
|
| -// converts a SkPaint to a GrPaint, ignoring the skPaint's shader
|
| -// justAlpha indicates that skPaint's alpha should be used rather than the color
|
| -// Callers may subsequently modify the GrPaint. Setting constantColor indicates
|
| -// that the final paint will draw the same color at every pixel. This allows
|
| -// an optimization where the the color filter can be applied to the skPaint's
|
| -// color once while converting to GrPaint and then ignored.
|
| -inline bool skPaint2GrPaintNoShader(SkGpuDevice* dev,
|
| - const SkPaint& skPaint,
|
| - bool justAlpha,
|
| - bool constantColor,
|
| - GrPaint* grPaint) {
|
| -
|
| - grPaint->setDither(skPaint.isDither());
|
| - grPaint->setAntiAlias(skPaint.isAntiAlias());
|
| -
|
| - SkXfermode::Coeff sm;
|
| - SkXfermode::Coeff dm;
|
| -
|
| - SkXfermode* mode = skPaint.getXfermode();
|
| - GrEffectRef* xferEffect = NULL;
|
| - if (SkXfermode::AsNewEffectOrCoeff(mode, &xferEffect, &sm, &dm)) {
|
| - if (NULL != xferEffect) {
|
| - grPaint->addColorEffect(xferEffect)->unref();
|
| - sm = SkXfermode::kOne_Coeff;
|
| - dm = SkXfermode::kZero_Coeff;
|
| - }
|
| - } else {
|
| - //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");)
|
| -#if 0
|
| - return false;
|
| -#else
|
| - // Fall back to src-over
|
| - sm = SkXfermode::kOne_Coeff;
|
| - dm = SkXfermode::kISA_Coeff;
|
| -#endif
|
| - }
|
| - grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm));
|
| -
|
| - if (justAlpha) {
|
| - uint8_t alpha = skPaint.getAlpha();
|
| - grPaint->setColor(GrColorPackRGBA(alpha, alpha, alpha, alpha));
|
| - // justAlpha is currently set to true only if there is a texture,
|
| - // so constantColor should not also be true.
|
| - SkASSERT(!constantColor);
|
| - } else {
|
| - grPaint->setColor(SkColor2GrColor(skPaint.getColor()));
|
| - }
|
| -
|
| - SkColorFilter* colorFilter = skPaint.getColorFilter();
|
| - if (NULL != colorFilter) {
|
| - // if the source color is a constant then apply the filter here once rather than per pixel
|
| - // in a shader.
|
| - if (constantColor) {
|
| - SkColor filtered = colorFilter->filterColor(skPaint.getColor());
|
| - grPaint->setColor(SkColor2GrColor(filtered));
|
| - } else {
|
| - SkAutoTUnref<GrEffectRef> effect(colorFilter->asNewEffect(dev->context()));
|
| - if (NULL != effect.get()) {
|
| - grPaint->addColorEffect(effect);
|
| - }
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// This function is similar to skPaint2GrPaintNoShader but also converts
|
| -// skPaint's shader to a GrTexture/GrEffectStage if possible. The texture to
|
| -// be used is set on grPaint and returned in param act. constantColor has the
|
| -// same meaning as in skPaint2GrPaintNoShader.
|
| -inline bool skPaint2GrPaintShader(SkGpuDevice* dev,
|
| - const SkPaint& skPaint,
|
| - bool constantColor,
|
| - GrPaint* grPaint) {
|
| - SkShader* shader = skPaint.getShader();
|
| - if (NULL == shader) {
|
| - return skPaint2GrPaintNoShader(dev, skPaint, false, constantColor, grPaint);
|
| - }
|
| -
|
| - // SkShader::asNewEffect() may do offscreen rendering. Setup default drawing state and require
|
| - // the shader to set a render target .
|
| - GrContext::AutoWideOpenIdentityDraw awo(dev->context(), NULL);
|
| -
|
| - // setup the shader as the first color effect on the paint
|
| - SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(dev->context(), skPaint, NULL));
|
| - if (NULL != effect.get()) {
|
| - grPaint->addColorEffect(effect);
|
| - // Now setup the rest of the paint.
|
| - return skPaint2GrPaintNoShader(dev, skPaint, true, false, grPaint);
|
| - } else {
|
| - // We still don't have SkColorShader::asNewEffect() implemented.
|
| - SkShader::GradientInfo info;
|
| - SkColor color;
|
| -
|
| - info.fColors = &color;
|
| - info.fColorOffsets = NULL;
|
| - info.fColorCount = 1;
|
| - if (SkShader::kColor_GradientType == shader->asAGradient(&info)) {
|
| - SkPaint copy(skPaint);
|
| - copy.setShader(NULL);
|
| - // modulate the paint alpha by the shader's solid color alpha
|
| - U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha());
|
| - copy.setColor(SkColorSetA(color, newA));
|
| - return skPaint2GrPaintNoShader(dev, copy, false, constantColor, grPaint);
|
| - } else {
|
| - return false;
|
| - }
|
| - }
|
| -}
|
| -}
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| SkBitmap::Config SkGpuDevice::config() const {
|
| @@ -511,9 +397,7 @@ void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) {
|
| CHECK_SHOULD_DRAW(draw, false);
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| fContext->drawPaint(grPaint);
|
| }
|
| @@ -543,9 +427,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| fContext->drawVertices(grPaint,
|
| gPointMode2PrimtiveType[mode],
|
| @@ -602,9 +484,7 @@ void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| if (!doStroke) {
|
| fContext->drawRect(grPaint, rect);
|
| @@ -622,9 +502,7 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
| CHECK_SHOULD_DRAW(draw, false);
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| SkStrokeRec stroke(paint);
|
| if (paint.getMaskFilter()) {
|
| @@ -678,9 +556,7 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| CHECK_SHOULD_DRAW(draw, false);
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| if (NULL == paint.getMaskFilter() && NULL == paint.getPathEffect()) {
|
| fContext->drawDRRect(grPaint, outer, inner);
|
| @@ -718,9 +594,7 @@ void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
| SkStrokeRec stroke(paint);
|
|
|
| fContext->drawOval(grPaint, oval, stroke);
|
| @@ -871,9 +745,7 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath,
|
| CHECK_SHOULD_DRAW(draw, false);
|
|
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| // If we have a prematrix, apply it to the path, optimizing for the case
|
| // where the original path can in fact be modified in place (even though
|
| @@ -1521,9 +1393,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
|
| GrPaint grPaint;
|
| grPaint.addColorEffect(effect);
|
| bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config());
|
| - if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint);
|
|
|
| fContext->drawRectToRect(grPaint, dstRect, paintRect, NULL);
|
| }
|
| @@ -1589,9 +1459,7 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
|
| GrPaint grPaint;
|
| grPaint.addColorTextureEffect(texture, SkMatrix::I());
|
|
|
| - if(!skPaint2GrPaintNoShader(this, paint, true, false, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintNoShader(this, paint, true, false, &grPaint);
|
|
|
| fContext->drawRectToRect(grPaint,
|
| SkRect::MakeXYWH(SkIntToScalar(left),
|
| @@ -1699,9 +1567,7 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| GrPaint grPaint;
|
| grPaint.addColorTextureEffect(devTex, SkMatrix::I());
|
|
|
| - if (!skPaint2GrPaintNoShader(this, paint, true, false, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintNoShader(this, paint, true, false, &grPaint);
|
|
|
| SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(x),
|
| SkIntToScalar(y),
|
| @@ -1762,13 +1628,9 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| GrPaint grPaint;
|
| // we ignore the shader if texs is null.
|
| if (NULL == texs) {
|
| - if (!skPaint2GrPaintNoShader(this, paint, false, NULL == colors, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintNoShader(this, paint, false, NULL == colors, &grPaint);
|
| } else {
|
| - if (!skPaint2GrPaintShader(this, paint, NULL == colors, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, NULL == colors, &grPaint);
|
| }
|
|
|
| if (NULL != xmode && NULL != texs && NULL != colors) {
|
| @@ -1808,18 +1670,14 @@ void SkGpuDevice::drawText(const SkDraw& draw, const void* text,
|
|
|
| if (fMainTextContext->canDraw(paint)) {
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| SkDEBUGCODE(this->validate();)
|
|
|
| fMainTextContext->drawText(grPaint, paint, (const char *)text, byteLength, x, y);
|
| } else if (fFallbackTextContext && fFallbackTextContext->canDraw(paint)) {
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| SkDEBUGCODE(this->validate();)
|
|
|
| @@ -1838,9 +1696,7 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text,
|
|
|
| if (fMainTextContext->canDraw(paint)) {
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| SkDEBUGCODE(this->validate();)
|
|
|
| @@ -1848,9 +1704,7 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text,
|
| constY, scalarsPerPos);
|
| } else if (fFallbackTextContext && fFallbackTextContext->canDraw(paint)) {
|
| GrPaint grPaint;
|
| - if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
|
| - return;
|
| - }
|
| + SkPaint2GrPaintShader(this, paint, true, &grPaint);
|
|
|
| SkDEBUGCODE(this->validate();)
|
|
|
|
|