aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar junov@google.com <junov@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-07-28 20:10:09 +0000
committerGravatar junov@google.com <junov@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-07-28 20:10:09 +0000
commit1d32978f7e927cb39da480c3bdce18363967313a (patch)
treeca74b13f20626e35bfe8d3f45da4caad3df18874
parent3eba9d31157d5d414f26dd9660ced79fbf50b4fd (diff)
Fixing the ignore transform flag in Ganesh with mask filter and drawBitmap
TEST=SampleApp/Texture Domain BUG=http://code.google.com/p/skia/issues/detail?id=335 REVIEW=http://codereview.appspot.com/4803052/ git-svn-id: http://skia.googlecode.com/svn/trunk@1987 2bbb7eff-a529-9590-31e7-b0007b416f81
-rwxr-xr-xsamplecode/SampleTextureDomain.cpp11
-rw-r--r--src/gpu/SkGpuDevice.cpp28
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;
}