diff options
-rwxr-xr-x | samplecode/SampleTextureDomain.cpp | 11 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 28 |
2 files changed, 23 insertions, 16 deletions
diff --git a/samplecode/SampleTextureDomain.cpp b/samplecode/SampleTextureDomain.cpp index 3a2a252877..4291468fc3 100755 --- a/samplecode/SampleTextureDomain.cpp +++ b/samplecode/SampleTextureDomain.cpp @@ -39,7 +39,7 @@ protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { if (SampleCode::TitleQ(*evt)) { - SampleCode::TitleR(evt, "Texture Domian"); + SampleCode::TitleR(evt, "Texture Domain"); return true; } return this->INHERITED::onQuery(evt); @@ -84,7 +84,8 @@ protected: SkMaskFilter* mf = SkBlurMaskFilter::Create( 5, SkBlurMaskFilter::kNormal_BlurStyle, - SkBlurMaskFilter::kHighQuality_BlurFlag); + SkBlurMaskFilter::kHighQuality_BlurFlag | + SkBlurMaskFilter::kIgnoreTransform_BlurFlag); paint.setMaskFilter(mf)->unref(); canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); @@ -93,6 +94,12 @@ protected: // but it will test a code path in SkGpuDevice::drawBitmap // that handles blurs with rects transformed to non- // orthogonal rects. It also tests the NULL src rect handling + mf = SkBlurMaskFilter::Create( + 5, + SkBlurMaskFilter::kNormal_BlurStyle, + SkBlurMaskFilter::kHighQuality_BlurFlag); + paint.setMaskFilter(mf)->unref(); + dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f); canvas->translate(550, 550); canvas->rotate(45); diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index d9b618a08a..4294e49072 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1237,33 +1237,33 @@ void SkGpuDevice::drawBitmap(const SkDraw& draw, } if (paint.getMaskFilter()){ - SkBitmap tmp; // storage if we need a subset of bitmap + // Convert the bitmap to a shader so that the rect can be drawn + // through drawRect, which supports mask filters. + SkBitmap tmp; // subset of bitmap, if necessary const SkBitmap* bitmapPtr = &bitmap; if (srcRectPtr) { if (!bitmap.extractSubset(&tmp, srcRect)) { return; // extraction failed } bitmapPtr = &tmp; + srcRect.set(0,0, srcRect.width(), srcRect.height()); } SkPaint paintWithTexture(paint); paintWithTexture.setShader(SkShader::CreateBitmapShader( *bitmapPtr, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref(); - paintWithTexture.getShader()->setLocalMatrix(m); - SkRect ScalarRect; ScalarRect.set(srcRect); - if (m.rectStaysRect()) { - // Preferred drawing method, optimized for rectangles - m.mapRect(&ScalarRect); - this->drawRect(draw, ScalarRect, paintWithTexture); - } else { - // Slower drawing method, for warped or rotated rectangles - SkPath path; - path.addRect(ScalarRect); - path.transform(m); - this->drawPath(draw, path, paintWithTexture, NULL, true); - } + // Transform 'm' needs to be concatenated to the draw matrix, + // rather than transforming the primitive directly, so that 'm' will + // also affect the behavior of the mask filter. + SkMatrix drawMatrix; + drawMatrix.setConcat(*draw.fMatrix, m); + SkDraw transformedDraw(draw); + transformedDraw.fMatrix = &drawMatrix; + + this->drawRect(transformedDraw, ScalarRect, paintWithTexture); + return; } |