diff options
author | reed <reed@google.com> | 2015-07-07 10:22:31 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-07 10:22:31 -0700 |
commit | a8db72864a43ad1fbba3c2892cf5cd88060a43ef (patch) | |
tree | 21845a4d0d502dba3ee439320099c94406bdf53f /src/core | |
parent | 31dc1b2db0f04e68e540ebc339c8bde0978e5b97 (diff) |
add matrix options to drawDrawable
BUG=skia:
Review URL: https://codereview.chromium.org/1224783002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkCanvas.cpp | 31 | ||||
-rw-r--r-- | src/core/SkDrawable.cpp | 10 | ||||
-rw-r--r-- | src/core/SkRecordDraw.cpp | 4 | ||||
-rw-r--r-- | src/core/SkRecorder.cpp | 4 | ||||
-rw-r--r-- | src/core/SkRecorder.h | 2 | ||||
-rw-r--r-- | src/core/SkRecords.h | 3 |
6 files changed, 42 insertions, 12 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 88339ff4f3..09bfa45935 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -2446,14 +2446,35 @@ void SkCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], LOOPER_END } -void SkCanvas::drawDrawable(SkDrawable* dr) { - if (dr && !this->quickReject(dr->getBounds())) { - this->onDrawDrawable(dr); +void SkCanvas::drawDrawable(SkDrawable* dr, SkScalar x, SkScalar y) { + if (dr) { + if (x || y) { + SkMatrix matrix = SkMatrix::MakeTrans(x, y); + this->onDrawDrawable(dr, &matrix); + } else { + this->onDrawDrawable(dr, NULL); + } } } -void SkCanvas::onDrawDrawable(SkDrawable* dr) { - dr->draw(this); +void SkCanvas::drawDrawable(SkDrawable* dr, const SkMatrix* matrix) { + if (dr) { + if (matrix && matrix->isIdentity()) { + matrix = NULL; + } + this->onDrawDrawable(dr, matrix); + } +} + +void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) { + SkRect bounds = dr->getBounds(); + if (matrix) { + matrix->mapRect(&bounds); + } + if (this->quickReject(bounds)) { + return; + } + dr->draw(this, matrix); } void SkCanvas::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[], diff --git a/src/core/SkDrawable.cpp b/src/core/SkDrawable.cpp index 64fefd2f1c..41547ee697 100644 --- a/src/core/SkDrawable.cpp +++ b/src/core/SkDrawable.cpp @@ -32,8 +32,11 @@ static void draw_bbox(SkCanvas* canvas, const SkRect& r) { canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint); } -void SkDrawable::draw(SkCanvas* canvas) { +void SkDrawable::draw(SkCanvas* canvas, const SkMatrix* matrix) { SkAutoCanvasRestore acr(canvas, true); + if (matrix) { + canvas->concat(*matrix); + } this->onDraw(canvas); if (false) { @@ -41,6 +44,11 @@ void SkDrawable::draw(SkCanvas* canvas) { } } +void SkDrawable::draw(SkCanvas* canvas, SkScalar x, SkScalar y) { + SkMatrix matrix = SkMatrix::MakeTrans(x, y); + this->draw(canvas, &matrix); +} + SkPicture* SkDrawable::newPictureSnapshot() { return this->onNewPictureSnapshot(); } diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp index 118027b7a7..7ef2eafda8 100644 --- a/src/core/SkRecordDraw.cpp +++ b/src/core/SkRecordDraw.cpp @@ -124,9 +124,9 @@ template <> void Draw::draw(const DrawDrawable& r) { SkASSERT(r.index < fDrawableCount); if (fDrawables) { SkASSERT(NULL == fDrawablePicts); - fCanvas->drawDrawable(fDrawables[r.index]); + fCanvas->drawDrawable(fDrawables[r.index], r.matrix); } else { - fCanvas->drawPicture(fDrawablePicts[r.index]); + fCanvas->drawPicture(fDrawablePicts[r.index], r.matrix, NULL); } } diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp index 7433a5b5bf..0413860e9d 100644 --- a/src/core/SkRecorder.cpp +++ b/src/core/SkRecorder.cpp @@ -155,12 +155,12 @@ void SkRecorder::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const APPEND(DrawDRRect, paint, outer, inner); } -void SkRecorder::onDrawDrawable(SkDrawable* drawable) { +void SkRecorder::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) { if (!fDrawableList) { fDrawableList.reset(SkNEW(SkDrawableList)); } fDrawableList->append(drawable); - APPEND(DrawDrawable, drawable->getBounds(), fDrawableList->count() - 1); + APPEND(DrawDrawable, this->copy(matrix), drawable->getBounds(), fDrawableList->count() - 1); } void SkRecorder::onDrawPath(const SkPath& path, const SkPaint& paint) { diff --git a/src/core/SkRecorder.h b/src/core/SkRecorder.h index 338fab4968..b151578397 100644 --- a/src/core/SkRecorder.h +++ b/src/core/SkRecorder.h @@ -62,7 +62,7 @@ public: void didSetMatrix(const SkMatrix&) override; void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; - void onDrawDrawable(SkDrawable*) override; + void onDrawDrawable(SkDrawable*, const SkMatrix*) override; void onDrawText(const void* text, size_t byteLength, SkScalar x, diff --git a/src/core/SkRecords.h b/src/core/SkRecords.h index b98b93c827..074a560c04 100644 --- a/src/core/SkRecords.h +++ b/src/core/SkRecords.h @@ -10,6 +10,7 @@ #include "SkCanvas.h" #include "SkDrawable.h" +#include "SkMatrix.h" #include "SkPathPriv.h" #include "SkPicture.h" #include "SkRSXform.h" @@ -289,7 +290,7 @@ RECORD5(DrawBitmapRectToRectFixedSize, SkPaint, paint, SkRect, dst, SkCanvas::DrawBitmapRectFlags, flags); RECORD3(DrawDRRect, SkPaint, paint, SkRRect, outer, SkRRect, inner); -RECORD2(DrawDrawable, SkRect, worstCaseBounds, int32_t, index); +RECORD3(DrawDrawable, Optional<SkMatrix>, matrix, SkRect, worstCaseBounds, int32_t, index); RECORD4(DrawImage, Optional<SkPaint>, paint, RefBox<const SkImage>, image, SkScalar, left, |