Index: src/pipe/SkGPipeWrite.cpp |
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp |
index 41b02344805ffceb09c1797367a78355024a7e1d..a1e7dc2872405f5e26ab630a537276ff7956b12b 100644 |
--- a/src/pipe/SkGPipeWrite.cpp |
+++ b/src/pipe/SkGPipeWrite.cpp |
@@ -250,6 +250,11 @@ public: |
const SkPaint*) SK_OVERRIDE; |
virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, |
const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE; |
+ virtual void drawImage(const SkImage* image, SkScalar left, SkScalar top, |
+ const SkPaint* paint) SK_OVERRIDE; |
+ virtual void drawImageRect(const SkImage* image, const SkRect* src, |
+ const SkRect& dst, |
+ const SkPaint* paint) SK_OVERRIDE; |
virtual void drawSprite(const SkBitmap&, int left, int top, |
const SkPaint*) SK_OVERRIDE; |
virtual void drawVertices(VertexMode, int vertexCount, |
@@ -359,6 +364,9 @@ private: |
bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, |
size_t opBytesNeeded, const SkPaint* paint); |
+ bool commonDrawImage(const SkImage* image, DrawOps op, unsigned flags, |
+ size_t opBytesNeeded, const SkPaint* paint); |
+ |
SkPaint fPaint; |
void writePaint(const SkPaint&); |
@@ -471,6 +479,7 @@ SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, |
} |
} |
fFlattenableHeap.setBitmapStorage(fBitmapHeap); |
+ |
this->doNotify(); |
} |
@@ -799,6 +808,79 @@ bool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, |
return false; |
} |
+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); |
+ } |
+ |
+ opBytesNeeded += sizeof (SkImage*); |
+ |
+ if (this->needOpBytes(opBytesNeeded)) { |
+ this->writeOp(op, flags, 0); |
+ |
+ image->ref(); // The SkGPipeReader will have to call unref() |
+ fWriter.writePtr(static_cast<void*>(const_cast<SkImage*>(image))); |
+ |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void SkGPipeCanvas::drawImage(const SkImage* image, SkScalar left, SkScalar top, |
+ const SkPaint* paint) { |
+ if (is_cross_process(fFlags)){ |
+ // If the SkGPipe is cross-process, we will have to flatten the data in the SkImage, so |
+ // fallback to the default implementation in SkCanvas (which calls SkImage::draw()) |
+ // https://code.google.com//p/skia/issues/detail?id=2985 |
+ this->INHERITED::drawImage(image, left, top, paint); |
+ } else { |
+ NOTIFY_SETUP(this); |
+ size_t opBytesNeeded = sizeof(SkScalar) * 2; |
+ |
+ if (this->commonDrawImage(image, kDrawImage_DrawOp, 0, opBytesNeeded, paint)) { |
+ fWriter.writeScalar(left); |
+ fWriter.writeScalar(top); |
+ } |
+ } |
+} |
+ |
+void SkGPipeCanvas::drawImageRect(const SkImage* image, const SkRect* src, |
+ const SkRect& dst, |
+ const SkPaint* paint) { |
+ if (is_cross_process(fFlags)){ |
+ // If the SkGPipe is cross-process, we will have to flatten the data in the SkImage, so |
+ // fallback to the default implementation in SkCanvas (which calls SkImage::drawRect()) |
+ // https://code.google.com//p/skia/issues/detail?id=2985 |
+ this->INHERITED::drawImageRect(image, src, dst, paint); |
+ } else { |
+ NOTIFY_SETUP(this); |
+ size_t opBytesNeeded = sizeof (SkRect); |
+ bool hasSrc = src != NULL; |
+ unsigned flags; |
+ if (hasSrc) { |
+ flags = kDrawImage_HasSrcRect_DrawOpFlag; |
+ opBytesNeeded += sizeof (SkRect); |
+ } else { |
+ flags = 0; |
+ } |
+ |
+ if (this->commonDrawImage(image, kDrawImageRect_DrawOp, flags, opBytesNeeded, paint)) { |
+ if (hasSrc) { |
+ fWriter.writeRect(*src); |
+ } |
+ fWriter.writeRect(dst); |
+ } |
+ } |
+} |
+ |
void SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, |
const SkPaint* paint) { |
NOTIFY_SETUP(this); |
@@ -1090,7 +1172,7 @@ void SkGPipeCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4 |
const SkPoint texCoords[4], SkXfermode* xmode, |
const SkPaint& paint) { |
NOTIFY_SETUP(this); |
- |
+ |
size_t size = SkPatchUtils::kNumCtrlPts * sizeof(SkPoint); |
unsigned flags = 0; |
if (colors) { |
@@ -1108,21 +1190,21 @@ void SkGPipeCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4 |
size += sizeof(int32_t); |
} |
} |
- |
+ |
this->writePaint(paint); |
if (this->needOpBytes(size)) { |
this->writeOp(kDrawPatch_DrawOp, flags, 0); |
- |
+ |
fWriter.write(cubics, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); |
- |
+ |
if (colors) { |
fWriter.write(colors, SkPatchUtils::kNumCorners * sizeof(SkColor)); |
} |
- |
+ |
if (texCoords) { |
fWriter.write(texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint)); |
} |
- |
+ |
if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { |
SkXfermode::Mode mode = SkXfermode::kModulate_Mode; |
SkAssertResult(xmode->asMode(&mode)); |