aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-07-07 10:22:31 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-07-07 10:22:31 -0700
commita8db72864a43ad1fbba3c2892cf5cd88060a43ef (patch)
tree21845a4d0d502dba3ee439320099c94406bdf53f /src/core
parent31dc1b2db0f04e68e540ebc339c8bde0978e5b97 (diff)
add matrix options to drawDrawable
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkCanvas.cpp31
-rw-r--r--src/core/SkDrawable.cpp10
-rw-r--r--src/core/SkRecordDraw.cpp4
-rw-r--r--src/core/SkRecorder.cpp4
-rw-r--r--src/core/SkRecorder.h2
-rw-r--r--src/core/SkRecords.h3
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,