Adding support for shadows when drawing bitmaps with skia gpu device
Added code to handle this case in SkGpuDevice::drawBitmap Added test to cover this use case in SampleTextureDomain.cpp BUG=http://code.google.com/p/chromium/issues/detail?id=83440 REVIEW=http://codereview.appspot.com/4530068/ git-svn-id: http://skia.googlecode.com/svn/trunk@1730 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
21031e9ee8
commit
d935cfbd79
@ -1,6 +1,7 @@
|
|||||||
#include "SampleCode.h"
|
#include "SampleCode.h"
|
||||||
#include "SkCanvas.h"
|
#include "SkCanvas.h"
|
||||||
#include "SkDevice.h"
|
#include "SkDevice.h"
|
||||||
|
#include "SkBlurMaskFilter.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
SkBitmap make_bitmap() {
|
SkBitmap make_bitmap() {
|
||||||
@ -68,6 +69,27 @@ protected:
|
|||||||
srcRect.setXYWH(1, 1, 3, 3);
|
srcRect.setXYWH(1, 1, 3, 3);
|
||||||
dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f);
|
dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f);
|
||||||
canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
|
canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
|
||||||
|
|
||||||
|
// Test that bitmap blurring using a subrect
|
||||||
|
// renders correctly
|
||||||
|
srcRect.setXYWH(1, 1, 3, 3);
|
||||||
|
dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f);
|
||||||
|
SkMaskFilter* mf = SkBlurMaskFilter::Create(
|
||||||
|
5,
|
||||||
|
SkBlurMaskFilter::kNormal_BlurStyle,
|
||||||
|
SkBlurMaskFilter::kHighQuality_BlurFlag);
|
||||||
|
paint.setMaskFilter(mf)->unref();
|
||||||
|
canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
|
||||||
|
|
||||||
|
// Blur and a rotation + NULL src rect
|
||||||
|
// This should not trigger the texture domain code
|
||||||
|
// 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
|
||||||
|
dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f);
|
||||||
|
canvas->translate(550, 550);
|
||||||
|
canvas->rotate(45);
|
||||||
|
canvas->drawBitmapRect(fBM, NULL, dstRect, &paint);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
typedef SkView INHERITED;
|
typedef SkView INHERITED;
|
||||||
|
@ -961,6 +961,37 @@ void SkGpuDevice::drawBitmap(const SkDraw& draw,
|
|||||||
srcRect = *srcRectPtr;
|
srcRect = *srcRectPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (paint.getMaskFilter()){
|
||||||
|
SkBitmap tmp; // storage if we need a subset of bitmap
|
||||||
|
const SkBitmap* bitmapPtr = &bitmap;
|
||||||
|
if (srcRectPtr) {
|
||||||
|
if (!bitmap.extractSubset(&tmp, srcRect)) {
|
||||||
|
return; // extraction failed
|
||||||
|
}
|
||||||
|
bitmapPtr = &tmp;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
GrPaint grPaint;
|
GrPaint grPaint;
|
||||||
if (!this->skPaint2GrPaintNoShader(paint, true, &grPaint, false)) {
|
if (!this->skPaint2GrPaintNoShader(paint, true, &grPaint, false)) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user