aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pipe
diff options
context:
space:
mode:
authorGravatar piotaixr <piotaixr@chromium.org>2014-10-16 11:55:35 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-16 11:55:35 -0700
commit687732fe046c9cfec940f2d7f661cd97651d10a8 (patch)
tree0e36e6418bae8dc36fd7d187ea58759d34593e33 /src/pipe
parent19653d1d004610b4ba07ce563a5701164e120e45 (diff)
Override SkCanvas::drawImage() in SkDeferredCanvas and SkGPipe
Diffstat (limited to 'src/pipe')
-rw-r--r--src/pipe/SkGPipePriv.h6
-rw-r--r--src/pipe/SkGPipeRead.cpp42
-rw-r--r--src/pipe/SkGPipeWrite.cpp94
3 files changed, 133 insertions, 9 deletions
diff --git a/src/pipe/SkGPipePriv.h b/src/pipe/SkGPipePriv.h
index 121512d42a..8d2a2af294 100644
--- a/src/pipe/SkGPipePriv.h
+++ b/src/pipe/SkGPipePriv.h
@@ -46,6 +46,8 @@ enum DrawOps {
kDrawClear_DrawOp,
kDrawData_DrawOp,
kDrawDRRect_DrawOp,
+ kDrawImage_DrawOp,
+ kDrawImageRect_DrawOp,
kDrawOval_DrawOp,
kDrawPaint_DrawOp,
kDrawPatch_DrawOp,
@@ -157,6 +159,10 @@ enum {
kDrawBitmap_Bleed_DrawOpFlag = 1 << 2,
};
enum {
+ kDrawImage_HasPaint_DrawOpFlag = 1 << 0,
+ kDrawImage_HasSrcRect_DrawOpFlag = 1 << 1,
+};
+enum {
kClip_HasAntiAlias_DrawOpFlag = 1 << 0,
};
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index 8cb0e34d0a..222dc99e1a 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -408,11 +408,11 @@ static void drawDRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
static void drawPatch_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
SkGPipeState* state) {
-
+
unsigned flags = DrawOp_unpackFlags(op32);
-
+
const SkPoint* cubics = skip<SkPoint>(reader, SkPatchUtils::kNumCtrlPts);
-
+
const SkColor* colors = NULL;
if (flags & kDrawVertices_HasColors_DrawOpFlag) {
colors = skip<SkColor>(reader, SkPatchUtils::kNumCorners);
@@ -651,6 +651,40 @@ static void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
}
}
+static void drawImage_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
+ SkGPipeState* state) {
+ bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag);
+ // Balances call to ref() in SkGPipeWrite
+ SkAutoTUnref<const SkImage> image (static_cast<const SkImage*>(reader->readPtr()));
+
+ SkScalar left = reader->readScalar();
+ SkScalar top = reader->readScalar();
+
+ if (state->shouldDraw()) {
+ canvas->drawImage(image, left, top, hasPaint ? &state->paint() : NULL);
+ }
+}
+
+static void drawImageRect_rp(SkCanvas* canvas, SkReader32* reader,
+ uint32_t op32, SkGPipeState* state) {
+ unsigned flags = DrawOp_unpackFlags(op32);
+ bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag);
+ bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag);
+ // Balances call to ref() in SkGPipeWrite
+ SkAutoTUnref<const SkImage> image (static_cast<const SkImage*>(reader->readPtr()));
+
+ const SkRect* src;
+ if (hasSrc) {
+ src = skip<SkRect>(reader);
+ } else {
+ src = NULL;
+ }
+ const SkRect* dst = skip<SkRect>(reader);
+ if (state->shouldDraw()) {
+ canvas->drawImageRect(image, src, *dst, hasPaint ? &state->paint() : NULL);
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
static void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
@@ -831,6 +865,8 @@ static const ReadProc gReadTable[] = {
drawClear_rp,
drawData_rp,
drawDRRect_rp,
+ drawImage_rp,
+ drawImageRect_rp,
drawOval_rp,
drawPaint_rp,
drawPatch_rp,
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 41b0234480..a1e7dc2872 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));