Chromium Code Reviews| Index: src/gpu/SkGpuDevice.cpp |
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
| index 09206052f0d6c568dcb30569fef719a7811b5d6d..1bd2b5188659be0544e8cf66135ba5c70d6f9c2d 100644 |
| --- a/src/gpu/SkGpuDevice.cpp |
| +++ b/src/gpu/SkGpuDevice.cpp |
| @@ -23,6 +23,7 @@ |
| #include "SkErrorInternals.h" |
| #include "SkGlyphCache.h" |
| #include "SkGrTexturePixelRef.h" |
| +#include "SkGrPriv.h" |
| #include "SkImage_Base.h" |
| #include "SkImageFilter.h" |
| #include "SkLayerInfo.h" |
| @@ -383,7 +384,7 @@ void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -432,7 +433,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, |
| if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mode) { |
| GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| SkPath path; |
| @@ -452,7 +453,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, |
| } |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -515,7 +516,7 @@ void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, |
| } |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -531,7 +532,7 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, |
| CHECK_SHOULD_DRAW(draw); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -602,7 +603,7 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, |
| CHECK_SHOULD_DRAW(draw); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -654,7 +655,7 @@ void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, |
| } |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -991,8 +992,8 @@ static void draw_aa_bitmap(GrDrawContext* drawContext, GrContext* context, |
| // Setup paint |
| GrColor paintColor = (kAlpha_8_SkColorType == bitmapPtr->colorType()) ? |
| - SkColor2GrColor(paint.getColor()) : |
| - SkColor2GrColorJustAlpha(paint.getColor()); |
| + SkColorToPremulGrColor(paint.getColor()) : |
| + SkColorAlphaToGrColor(paint.getColor()); |
| GrPaint grPaint; |
| @@ -1007,10 +1008,7 @@ static void draw_aa_bitmap(GrDrawContext* drawContext, GrContext* context, |
| SkMatrix::I(), params)); |
| } |
| - // The bitmap read has to be first |
| - grPaint.addColorFragmentProcessor(fp); |
| - if (!SkPaint2GrPaintNoShader(context, paint, SkColor2GrColor(paint.getColor()), false, |
| - &grPaint)) { |
| + if (!SkPaintToGrPaintReplaceShader(context, paint, fp, &grPaint)) { |
| return; |
| } |
| @@ -1311,7 +1309,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, |
| // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring |
| // the rest from the SkPaint. |
| GrPaint grPaint; |
| - SkAutoTUnref<GrFragmentProcessor> fp; |
| + SkAutoTUnref<const GrFragmentProcessor> fp; |
| if (needsTextureDomain && (SkCanvas::kStrict_SrcRectConstraint == constraint)) { |
| // Use a constrained texture domain to avoid color bleeding |
| @@ -1352,11 +1350,14 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, |
| SkMatrix::I(), params)); |
| } |
| - grPaint.addColorFragmentProcessor(fp); |
| - bool alphaOnly = !(kAlpha_8_SkColorType == bitmap.colorType()); |
| - GrColor paintColor = (alphaOnly) ? SkColor2GrColorJustAlpha(paint.getColor()) : |
| - SkColor2GrColor(paint.getColor()); |
| - if (!SkPaint2GrPaintNoShader(this->context(), paint, paintColor, false, &grPaint)) { |
| + bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); |
| + if (alphaOnly) { |
| + fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
| + } else { |
| + fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| + } |
| + |
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { |
| return; |
| } |
| @@ -1401,6 +1402,8 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
| return; |
| } |
| + bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); |
| + |
| SkImageFilter* filter = paint.getImageFilter(); |
| // This bitmap will own the filtered result as a texture. |
| SkBitmap filteredBitmap; |
| @@ -1424,13 +1427,19 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
| } else { |
| return; |
| } |
| + SkASSERT(!GrPixelConfigIsAlphaOnly(texture->config())); |
| + alphaOnly = false; |
| } |
| GrPaint grPaint; |
| - grPaint.addColorTextureProcessor(texture, SkMatrix::I()); |
| - |
| - if (!SkPaint2GrPaintNoShader(this->context(), paint, |
| - SkColor2GrColorJustAlpha(paint.getColor()), false, &grPaint)) { |
| + SkAutoTUnref<const GrFragmentProcessor> fp( |
| + GrSimpleTextureEffect::Create(grPaint.getProcessorDataManager(), texture, SkMatrix::I())); |
| + if (alphaOnly) { |
| + fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
| + } else { |
| + fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| + } |
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { |
| return; |
| } |
| @@ -1542,10 +1551,16 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, |
| } |
| GrPaint grPaint; |
| - grPaint.addColorTextureProcessor(devTex, SkMatrix::I()); |
| + SkAutoTUnref<const GrFragmentProcessor> fp( |
| + GrSimpleTextureEffect::Create(grPaint.getProcessorDataManager(), devTex, SkMatrix::I())); |
| + if (GrPixelConfigIsAlphaOnly(devTex->config())) { |
|
robertphillips
2015/09/25 19:52:17
I don't think so
bsalomon
2015/09/25 20:45:07
I thought we sometimes internally created A8 devic
|
| + // Can this happen? |
| + fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
| + } else { |
| + fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| + } |
| - if (!SkPaint2GrPaintNoShader(this->context(), paint, |
| - SkColor2GrColorJustAlpha(paint.getColor()), false, &grPaint)) { |
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { |
| return; |
| } |
| @@ -1666,11 +1681,6 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
| CHECK_SHOULD_DRAW(draw); |
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawVertices", fContext); |
| - const uint16_t* outIndices; |
| - SkAutoTDeleteArray<uint16_t> outAlloc(nullptr); |
| - GrPrimitiveType primType; |
| - GrPaint grPaint; |
| - |
| // If both textures and vertex-colors are nullptr, strokes hairlines with the paint's color. |
| if ((nullptr == texs || nullptr == paint.getShader()) && nullptr == colors) { |
| @@ -1680,13 +1690,12 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
| copy.setStyle(SkPaint::kStroke_Style); |
| copy.setStrokeWidth(0); |
| + GrPaint grPaint; |
| // we ignore the shader if texs is null. |
| - if (!SkPaint2GrPaintNoShader(this->context(), copy, |
| - SkColor2GrColor(copy.getColor()), nullptr == colors, &grPaint)) { |
| + if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint)) { |
| return; |
| } |
| - primType = kLines_GrPrimitiveType; |
| int triangleCount = 0; |
| int n = (nullptr == indices) ? vertexCount : indexCount; |
| switch (vmode) { |
| @@ -1705,45 +1714,32 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
| //number of indices for lines per triangle with kLines |
| indexCount = triangleCount * 6; |
| - outAlloc.reset(new uint16_t[indexCount]); |
| - outIndices = outAlloc.get(); |
| - uint16_t* auxIndices = outAlloc.get(); |
| + SkAutoTDeleteArray<uint16_t> lineIndices(new uint16_t[indexCount]); |
| int i = 0; |
| while (vertProc(&state)) { |
| - auxIndices[i] = state.f0; |
| - auxIndices[i + 1] = state.f1; |
| - auxIndices[i + 2] = state.f1; |
| - auxIndices[i + 3] = state.f2; |
| - auxIndices[i + 4] = state.f2; |
| - auxIndices[i + 5] = state.f0; |
| + lineIndices[i] = state.f0; |
| + lineIndices[i + 1] = state.f1; |
| + lineIndices[i + 2] = state.f1; |
| + lineIndices[i + 3] = state.f2; |
| + lineIndices[i + 4] = state.f2; |
| + lineIndices[i + 5] = state.f0; |
| i += 6; |
| } |
| - } else { |
| - outIndices = indices; |
| - primType = gVertexMode2PrimitiveType[vmode]; |
| - |
| - if (nullptr == texs || nullptr == paint.getShader()) { |
| - if (!SkPaint2GrPaintNoShader(this->context(), paint, |
| - SkColor2GrColor(paint.getColor()), |
| - nullptr == colors, &grPaint)) { |
| - return; |
| - } |
| - } else { |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, |
| - nullptr == colors, &grPaint)) { |
| - return; |
| - } |
| - } |
| + fDrawContext->drawVertices(fRenderTarget, |
| + fClip, |
| + grPaint, |
| + *draw.fMatrix, |
| + kLines_GrPrimitiveType, |
| + vertexCount, |
| + vertices, |
| + texs, |
| + colors, |
| + lineIndices.get(), |
| + indexCount); |
| + return; |
| } |
| -#if 0 |
| - if (xmode && texs && colors) { |
| - if (!SkXfermode::IsMode(xmode, SkXfermode::kModulate_Mode)) { |
| - SkDebugf("Unsupported vertex-color/texture xfer mode.\n"); |
| - return; |
| - } |
| - } |
| -#endif |
| + GrPrimitiveType primType = gVertexMode2PrimitiveType[vmode]; |
| SkAutoSTMalloc<128, GrColor> convertedColors(0); |
| if (colors) { |
| @@ -1755,10 +1751,36 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
| if (paint.getAlpha() != 255) { |
| color = SkColorSetA(color, SkMulDiv255Round(SkColorGetA(color), paint.getAlpha())); |
| } |
| - convertedColors[i] = SkColor2GrColor(color); |
| + /// TODO: Perform the premul after interpolating |
| + convertedColors[i] = SkColorToPremulGrColor(color); |
| } |
| colors = convertedColors.get(); |
| } |
| + GrPaint grPaint; |
| + if (texs && colors && paint.getShader()) { |
|
robertphillips
2015/09/25 19:52:17
Missing period before 'A' ?
bsalomon
2015/09/25 20:45:07
Done.
|
| + // When there are texs and colors the shader and colors are combined using xmode A null |
| + // xmode is defined to mean modulate. |
| + SkXfermode::Mode colorMode; |
| + if (xmode) { |
| + if (!xmode->asMode(&colorMode)) { |
| + return; |
| + } |
| + } else { |
| + colorMode = SkXfermode::kModulate_Mode; |
| + } |
| + if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMatrix, colorMode, false, |
| + &grPaint)) { |
| + return; |
| + } |
| + } else if (!texs) { |
| + // Defined to ignore the shader unless texs is provided. |
| + if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint)) { |
| + return; |
| + } |
| + } else if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| + return; |
| + } |
| + |
| fDrawContext->drawVertices(fRenderTarget, |
| fClip, |
| grPaint, |
| @@ -1768,7 +1790,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
| vertices, |
| texs, |
| colors, |
| - outIndices, |
| + indices, |
| indexCount); |
| } |
| @@ -1789,21 +1811,18 @@ void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS |
| p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref(); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), p, *draw.fMatrix, !colors, &grPaint)) { |
| - return; |
| - } |
| - |
| - SkDEBUGCODE(this->validate();) |
| - |
| -#if 0 |
| if (colors) { |
| - if (SkXfermode::kModulate_Mode != mode) { |
| - SkDebugf("Unsupported vertex-color/texture xfer mode.\n"); |
| + if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mode, true, |
| + &grPaint)) { |
| + return; |
| + } |
| + } else { |
| + if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| } |
| -#endif |
| - |
| + |
| + SkDEBUGCODE(this->validate();) |
| fDrawContext->drawAtlas(fRenderTarget, fClip, grPaint, *draw.fMatrix, |
| count, xform, texRect, colors); |
| } |
| @@ -1817,7 +1836,7 @@ void SkGpuDevice::drawText(const SkDraw& draw, const void* text, |
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |
| @@ -1834,7 +1853,7 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL |
| CHECK_SHOULD_DRAW(draw); |
| GrPaint grPaint; |
| - if (!SkPaint2GrPaint(this->context(), paint, *draw.fMatrix, true, &grPaint)) { |
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| return; |
| } |