add matrix options to drawDrawable
BUG=skia: Review URL: https://codereview.chromium.org/1224783002
This commit is contained in:
parent
31dc1b2db0
commit
a8db72864a
@ -10,9 +10,7 @@
|
||||
#include "SkDrawable.h"
|
||||
|
||||
struct MyDrawable : public SkDrawable {
|
||||
SkRect onGetBounds() override {
|
||||
return SkRect::MakeWH(640, 480);
|
||||
}
|
||||
SkRect onGetBounds() override { return SkRect::MakeWH(50, 100); }
|
||||
|
||||
void onDraw(SkCanvas* canvas) override {
|
||||
SkPath path;
|
||||
@ -29,7 +27,20 @@ struct MyDrawable : public SkDrawable {
|
||||
}
|
||||
};
|
||||
|
||||
DEF_SIMPLE_GM(Drawables, canvas, 640, 480) {
|
||||
SkAutoTUnref<SkDrawable> d(new MyDrawable);
|
||||
canvas->drawDrawable(d);
|
||||
/*
|
||||
* Test calling drawables w/ translate and matrices
|
||||
*/
|
||||
DEF_SIMPLE_GM(drawable, canvas, 180, 275) {
|
||||
SkAutoTUnref<SkDrawable> drawable(new MyDrawable);
|
||||
|
||||
canvas->translate(10, 10);
|
||||
canvas->drawDrawable(drawable);
|
||||
canvas->drawDrawable(drawable, 0, 150);
|
||||
|
||||
SkMatrix m = SkMatrix::MakeScale(1.5f, 0.8f);
|
||||
m.postTranslate(70, 0);
|
||||
canvas->drawDrawable(drawable, &m);
|
||||
|
||||
m.postTranslate(0, 150);
|
||||
canvas->drawDrawable(drawable, &m);
|
||||
}
|
||||
|
@ -1073,7 +1073,8 @@ public:
|
||||
* If the intent is to force the contents of the drawable into this canvas immediately,
|
||||
* then drawable->draw(canvas) may be called.
|
||||
*/
|
||||
void drawDrawable(SkDrawable* drawable);
|
||||
void drawDrawable(SkDrawable* drawable, const SkMatrix* = NULL);
|
||||
void drawDrawable(SkDrawable*, SkScalar x, SkScalar y);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -1229,7 +1230,7 @@ protected:
|
||||
virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
|
||||
const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
|
||||
|
||||
virtual void onDrawDrawable(SkDrawable*);
|
||||
virtual void onDrawDrawable(SkDrawable*, const SkMatrix*);
|
||||
|
||||
virtual void onDrawPaint(const SkPaint&);
|
||||
virtual void onDrawRect(const SkRect&, const SkPaint&);
|
||||
|
@ -30,7 +30,8 @@ public:
|
||||
* (i.e. the saveLevel() on the canvas will match what it was when draw() was called,
|
||||
* and the current matrix and clip settings will not be changed.
|
||||
*/
|
||||
void draw(SkCanvas*);
|
||||
void draw(SkCanvas*, const SkMatrix* = NULL);
|
||||
void draw(SkCanvas*, SkScalar x, SkScalar y);
|
||||
|
||||
SkPicture* newPictureSnapshot();
|
||||
|
||||
|
@ -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[],
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -251,8 +251,8 @@ void SkAndroidSDKCanvas::onDrawPicture(const SkPicture* picture,
|
||||
fProxyTarget->drawPicture(picture, matrix, filteredPaint);
|
||||
}
|
||||
|
||||
void SkAndroidSDKCanvas::onDrawDrawable(SkDrawable* drawable) {
|
||||
fProxyTarget->drawDrawable(drawable);
|
||||
void SkAndroidSDKCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) {
|
||||
fProxyTarget->drawDrawable(drawable, matrix);
|
||||
}
|
||||
|
||||
SkISize SkAndroidSDKCanvas::getBaseLayerSize() const {
|
||||
|
@ -78,7 +78,7 @@ protected:
|
||||
|
||||
// PASS THROUGH
|
||||
|
||||
void onDrawDrawable(SkDrawable*) override;
|
||||
void onDrawDrawable(SkDrawable*, const SkMatrix*) override;
|
||||
SkISize getBaseLayerSize() const override;
|
||||
bool getClipBounds(SkRect*) const override;
|
||||
bool getClipDeviceBounds(SkIRect*) const override;
|
||||
|
Loading…
Reference in New Issue
Block a user