Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Unified Diff: src/pipe/SkGPipeWrite.cpp

Issue 1129843003: Make drawImage a virtual on SkDevice (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pipe/SkGPipeRead.cpp ('k') | src/utils/SkDeferredCanvas.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pipe/SkGPipeWrite.cpp
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 83e5c57d274b8dd92dafc0ac6bcc4ffbedf1e8a0..2e73be83f11231d9602b0127c55be35ea48763be 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -272,12 +272,9 @@ protected:
void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
DrawBitmapRectFlags flags) override;
-#if 0
- // rely on decomposition into bitmap (for now)
void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
const SkPaint*) override;
-#endif
void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
const SkPaint*) override;
void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override;
@@ -300,6 +297,7 @@ private:
SkNamedFactorySet* fFactorySet;
SkBitmapHeap* fBitmapHeap;
+ SkImageHeap* fImageHeap;
SkGPipeController* fController;
SkWriter32& fWriter;
size_t fBlockSize; // amount allocated for writer
@@ -348,8 +346,8 @@ private:
// Common code used by drawBitmap*. Behaves differently depending on the
// type of SkBitmapHeap being used, which is determined by the flags used.
- bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags,
- size_t opBytesNeeded, const SkPaint* paint);
+ bool commonDrawBitmap(const SkBitmap&, DrawOps, unsigned flags, size_t bytes, const SkPaint*);
+ bool commonDrawImage(const SkImage*, DrawOps, unsigned flags, size_t bytes, const SkPaint*);
SkPaint fPaint;
void writePaint(const SkPaint&);
@@ -462,6 +460,13 @@ SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller,
}
}
fFlattenableHeap.setBitmapStorage(fBitmapHeap);
+
+ fImageHeap = SkNEW(SkImageHeap);
+ if (this->needOpBytes(sizeof(void*))) {
+ this->writeOp(kShareImageHeap_DrawOp);
+ fWriter.writePtr(static_cast<void*>(fImageHeap));
+ }
+
this->doNotify();
}
@@ -469,6 +474,7 @@ SkGPipeCanvas::~SkGPipeCanvas() {
this->finish(true);
SkSafeUnref(fFactorySet);
SkSafeUnref(fBitmapHeap);
+ SkSafeUnref(fImageHeap);
}
bool SkGPipeCanvas::needOpBytes(size_t needed) {
@@ -823,6 +829,53 @@ void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk
}
}
+bool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned flags,
+ size_t opBytesNeeded, const SkPaint* paint) {
+ if (fDone) {
+ return false;
+ }
+
+ if (paint != NULL) {
+ flags |= kDrawBitmap_HasPaint_DrawOpFlag;
+ this->writePaint(*paint);
+ }
+ // This needs to run first so its calls to needOpBytes() and its writes
+ // don't interlace with the needOpBytes() and write below.
+ int32_t slot = fImageHeap->insert(image);
+ SkASSERT(slot != 0);
+ if (this->needOpBytes(opBytesNeeded)) {
+ this->writeOp(op, flags, slot);
+ return true;
+ }
+ return false;
+}
+
+void SkGPipeCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y,
+ const SkPaint* paint) {
+ NOTIFY_SETUP(this);
+ if (this->commonDrawImage(image, kDrawImage_DrawOp, 0, sizeof(SkScalar) * 2, paint)) {
+ fWriter.writeScalar(x);
+ fWriter.writeScalar(y);
+ }
+}
+
+void SkGPipeCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
+ const SkPaint* paint) {
+ NOTIFY_SETUP(this);
+ unsigned flags = 0;
+ size_t opBytesNeeded = sizeof(SkRect); // dst
+ if (src) {
+ flags |= kDrawBitmap_HasSrcRect_DrawOpFlag;
+ opBytesNeeded += sizeof(SkRect); // src
+ }
+ if (this->commonDrawImage(image, kDrawImageRect_DrawOp, flags, opBytesNeeded, paint)) {
+ if (src) {
+ fWriter.writeRect(*src);
+ }
+ fWriter.writeRect(dst);
+ }
+}
+
void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
const SkPaint& paint) {
if (byteLength) {
@@ -1337,3 +1390,34 @@ void BitmapShuttle::removeCanvas() {
fCanvas->unref();
fCanvas = NULL;
}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+SkImageHeap::SkImageHeap() {}
+
+SkImageHeap::~SkImageHeap() {
+ fArray.unrefAll();
+}
+
+const SkImage* SkImageHeap::get(int32_t slot) const {
+ SkASSERT(slot > 0);
+ return fArray[slot - 1];
+}
+
+int32_t SkImageHeap::find(const SkImage* img) const {
+ int index = fArray.find(img);
+ if (index >= 0) {
+ return index + 1; // found
+ }
+ return 0; // not found
+}
+
+int32_t SkImageHeap::insert(const SkImage* img) {
+ int32_t slot = this->find(img);
+ if (slot) {
+ return slot;
+ }
+ *fArray.append() = SkRef(img);
+ return fArray.count(); // slot is always index+1
+}
+
« no previous file with comments | « src/pipe/SkGPipeRead.cpp ('k') | src/utils/SkDeferredCanvas.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698