aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hal Canary <halcanary@google.com>2017-06-07 11:47:51 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-07 19:30:05 +0000
commitfa2a26a026fb69659eef3857be58d4d5b0c75e29 (patch)
treebc53d1074bf6e85b1add5eda116a086f830b3620
parenta924dd3b7ec550791224a0f1b9cf55e8b5a1ab64 (diff)
SkPDF: Do draw{Image,Bitmap}Rect with maskfilter.
https://fiddle.skia.org/c/@skbug_237_drawImageRect BUG=skia:237 Change-Id: I4d6d683fcbfd6dc86a27998e3d03534458952db0 Reviewed-on: https://skia-review.googlesource.com/19023 Reviewed-by: Ben Wagner <bungeman@google.com> Commit-Queue: Hal Canary <halcanary@google.com>
-rw-r--r--src/pdf/SkPDFCanvas.cpp52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/pdf/SkPDFCanvas.cpp b/src/pdf/SkPDFCanvas.cpp
index c5cde3d113..a0ab8f16f7 100644
--- a/src/pdf/SkPDFCanvas.cpp
+++ b/src/pdf/SkPDFCanvas.cpp
@@ -54,13 +54,47 @@ void SkPDFCanvas::onDrawImageNine(const SkImage* image,
}
}
+static bool is_integer(SkScalar x) {
+ return x == SkScalarTruncToScalar(x);
+}
+
+static bool is_integral(const SkRect& r) {
+ return is_integer(r.left()) &&
+ is_integer(r.top()) &&
+ is_integer(r.right()) &&
+ is_integer(r.bottom());
+}
+
void SkPDFCanvas::onDrawImageRect(const SkImage* image,
const SkRect* src,
const SkRect& dst,
const SkPaint* paint,
SkCanvas::SrcRectConstraint constraint) {
- SkAutoCanvasRestore autoCanvasRestore(this, true);
- this->clipRect(dst);
+ SkASSERT(src);
+ SkASSERT(image);
+ if (paint && paint->getMaskFilter()) {
+ SkPaint paintCopy(*paint);
+ paintCopy.setAntiAlias(true);
+ SkRect srcRect = src ? *src : SkRect::Make(image->bounds());
+ SkMatrix m = SkMatrix::MakeRectToRect(srcRect, dst, SkMatrix::kFill_ScaleToFit);
+ if (!src || *src == SkRect::Make(image->bounds()) ||
+ SkCanvas::kFast_SrcRectConstraint == constraint) {
+ paintCopy.setShader(image->makeShader(&m));
+ } else {
+ SkIRect subset = src->roundOut();
+ m.preTranslate(subset.x(), subset.y());
+ auto si = image->makeSubset(subset);
+ if (!si) { return; }
+ paintCopy.setShader(si->makeShader(&m));
+ }
+ this->drawRect(dst, paintCopy);
+ return;
+ }
+ SkAutoCanvasRestore autoCanvasRestore(this, false);
+ if (src && !is_integral(*src)) {
+ this->save();
+ this->clipRect(dst);
+ }
this->SkCanvas::onDrawImageRect(image, src, dst, paint, constraint);
}
@@ -69,8 +103,18 @@ void SkPDFCanvas::onDrawBitmapRect(const SkBitmap& bitmap,
const SkRect& dst,
const SkPaint* paint,
SkCanvas::SrcRectConstraint constraint) {
- SkAutoCanvasRestore autoCanvasRestore(this, true);
- this->clipRect(dst);
+ SkASSERT(src);
+ if (paint && paint->getMaskFilter()) {
+ if (sk_sp<SkImage> img = SkImage::MakeFromBitmap(bitmap)) {
+ this->onDrawImageRect(img.get(), src, dst, paint, constraint);
+ }
+ return;
+ }
+ SkAutoCanvasRestore autoCanvasRestore(this, false);
+ if (src && !is_integral(*src)) {
+ this->save();
+ this->clipRect(dst);
+ }
this->SkCanvas::onDrawBitmapRect(bitmap, src, dst, paint, constraint);
}