aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar junov@google.com <junov@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-06-30 22:16:06 +0000
committerGravatar junov@google.com <junov@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-06-30 22:16:06 +0000
commit22c8bb8ebddcf695035b7f9c7f47405ae160b485 (patch)
tree7c31425a504294ec1e2a646f0ac3ae5789120772 /src/gpu
parent3582bf9e3d94feac5d4cc64fdb646dd68a3e4b18 (diff)
Fixing several issues with rendering blurred bitmaps with Ganesh
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/SkGpuDevice.cpp49
1 files changed, 31 insertions, 18 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 4f2d7c48c1..af31ee57b2 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -962,33 +962,46 @@ void SkGpuDevice::drawBitmap(const SkDraw& draw,
}
if (paint.getMaskFilter()){
- SkBitmap tmp; // storage if we need a subset of bitmap
+ SkBitmap tmpBitmap; // local copy of bitmap
const SkBitmap* bitmapPtr = &bitmap;
- if (srcRectPtr) {
- if (!bitmap.extractSubset(&tmp, srcRect)) {
- return; // extraction failed
- }
- bitmapPtr = &tmp;
+
+ // FIXME : texture-backed bitmaps not yet supported
+ SkAutoLockPixels alp(bitmap);
+ if (!bitmap.getPixels())
+ return;
+
+ // A temporary copy of the bitmap may be necessary
+ // to prevent color bleeding if a sub rect is used
+ if (NULL != srcRectPtr) {
+ tmpBitmap.setConfig(bitmap.config(), srcRect.width(),
+ srcRect.height());
+
+ size_t pixelOffset = srcRect.fTop * bitmap.rowBytes()
+ + srcRect.fLeft * bitmap.bytesPerPixel();
+ tmpBitmap.copyPixelsFrom(
+ (uint8_t*)bitmap.getPixels() + pixelOffset,
+ bitmap.getSafeSize() - pixelOffset,
+ bitmap.rowBytes());
+
+ bitmapPtr = &tmpBitmap;
}
+
SkPaint paintWithTexture(paint);
paintWithTexture.setShader(SkShader::CreateBitmapShader( *bitmapPtr,
SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref();
paintWithTexture.getShader()->setLocalMatrix(m);
SkRect ScalarRect;
- ScalarRect.set(srcRect);
+ ScalarRect.setXYWH(0, 0, srcRect.width(), srcRect.height());
- 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' must be applied globally so that it will
+ // affect the blur radius.
+ SkMatrix matrix = *draw.fMatrix;
+ matrix.preConcat(m);
+ SkDraw myDraw(draw);
+ myDraw.fMatrix = &matrix;
+
+ this->drawRect(myDraw, ScalarRect, paintWithTexture);
return;
}