From 85e143c33c214e54187aa28146aa7666961a0d17 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Mon, 30 Dec 2013 15:51:25 +0000 Subject: [PATCH] reenable vertices gm, adding picture support BUG= Review URL: https://codereview.chromium.org/112913005 git-svn-id: http://skia.googlecode.com/svn/trunk@12845 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/vertices.cpp | 38 +++++++++++++++++++++++--------------- gyp/gmslides.gypi | 2 +- src/core/SkPictureFlat.h | 3 ++- src/core/SkPicturePlayback.cpp | 10 +++++++++- src/core/SkPictureRecord.cpp | 16 +++++++++++++++- src/pdf/SkPDFDevice.cpp | 2 +- src/pipe/SkGPipePriv.h | 1 + src/pipe/SkGPipeRead.cpp | 11 +++++++---- src/pipe/SkGPipeWrite.cpp | 18 ++++++++++++------ 9 files changed, 71 insertions(+), 30 deletions(-) diff --git a/gm/vertices.cpp b/gm/vertices.cpp index 8281bd8..c0d2075 100644 --- a/gm/vertices.cpp +++ b/gm/vertices.cpp @@ -10,12 +10,14 @@ #include "SkGradientShader.h" #include "SkRandom.h" -static SkShader* make_shader(int w, int h) { - const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; - const SkPoint center = { SkScalarHalf(w), SkScalarHalf(h) }; - const SkScalar radius = w / 2; - - return SkGradientShader::CreateRadial(center, radius, colors, NULL, +static SkShader* make_shader(SkScalar w, SkScalar h) { + const SkColor colors[] = { + SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, + SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW, + }; + const SkPoint pts[] = { { w/4, 0 }, { 3*w/4, h } }; + + return SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode); } @@ -36,12 +38,15 @@ public: protected: virtual void onOnceBeforeDraw() SK_OVERRIDE { - fPts[0].set(0, 0); fPts[1].set(100, 10); fPts[2].set(200, 0); - fPts[3].set(10, 100); fPts[4].set(100, 100); fPts[5].set(190, 100); - fPts[6].set(0, 200); fPts[7].set(100, 190); fPts[8].set(200, 200); + const SkScalar X = 150; + const SkScalar Y = 150; + + fPts[0].set(0, 0); fPts[1].set(X/2, 10); fPts[2].set(X, 0); + fPts[3].set(10, Y/2); fPts[4].set(X/2, Y/2); fPts[5].set(X-10, Y/2); + fPts[6].set(0, Y); fPts[7].set(X/2, Y-10); fPts[8].set(X, Y); - int w = 200; - int h = 200; + const SkScalar w = 200; + const SkScalar h = 200; fTexs[0].set(0, 0); fTexs[1].set(w/2, 0); fTexs[2].set(w, 0); fTexs[3].set(0, h/2); fTexs[4].set(w/2, h/2); fTexs[5].set(w, h/2); @@ -51,7 +56,7 @@ protected: SkRandom rand; for (size_t i = 0; i < SK_ARRAY_COUNT(fColors); ++i) { - fColors[i] = rand.nextU() | 0xFF202020; + fColors[i] = rand.nextU() | 0xFF000000; } } @@ -60,10 +65,11 @@ protected: } virtual SkISize onISize() SK_OVERRIDE { - return SkISize::Make(800, 800); + return SkISize::Make(600, 600); } virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + // start with the center of a 3x3 grid static const uint16_t fan[] = { 4, 0, 1, 2, 5, 8, 7, 6, 3, 0 @@ -96,17 +102,19 @@ protected: SK_ARRAY_COUNT(fPts), fPts, rec[i].fTexs, rec[i].fColors, xfer, fan, SK_ARRAY_COUNT(fan), paint); - canvas->translate(250, 0); + canvas->translate(200, 0); } canvas->restore(); - canvas->translate(0, 250); + canvas->translate(0, 200); xfer->unref(); } } +#if 0 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag | kSkipPicture_Flag; } +#endif private: typedef skiagm::GM INHERITED; diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index 61e8fb7..40eb101 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -143,7 +143,7 @@ '../gm/tinybitmap.cpp', '../gm/twopointradial.cpp', '../gm/typeface.cpp', -# '../gm/vertices.cpp', + '../gm/vertices.cpp', '../gm/verttext.cpp', '../gm/verttext2.cpp', '../gm/verylargebitmap.cpp', diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h index ac8e304..5452501 100644 --- a/src/core/SkPictureFlat.h +++ b/src/core/SkPictureFlat.h @@ -77,7 +77,8 @@ static const int kDRAW_BITMAP_FLAVOR = LAST_DRAWTYPE_ENUM+1; enum DrawVertexFlags { DRAW_VERTICES_HAS_TEXS = 0x01, DRAW_VERTICES_HAS_COLORS = 0x02, - DRAW_VERTICES_HAS_INDICES = 0x04 + DRAW_VERTICES_HAS_INDICES = 0x04, + DRAW_VERTICES_HAS_XFER = 0x08, }; /////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp index cb73689..195afc6 100644 --- a/src/core/SkPicturePlayback.cpp +++ b/src/core/SkPicturePlayback.cpp @@ -1025,6 +1025,7 @@ void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback) matrix, paint); } break; case DRAW_VERTICES: { + SkAutoTUnref xfer; const SkPaint& paint = *getPaint(reader); DrawVertexFlags flags = (DrawVertexFlags)reader.readInt(); SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader.readInt(); @@ -1048,7 +1049,14 @@ void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback) indices = (const uint16_t*)reader.skip( iCount * sizeof(uint16_t)); } - canvas.drawVertices(vmode, vCount, verts, texs, colors, NULL, + if (flags & DRAW_VERTICES_HAS_XFER) { + int mode = reader.readInt(); + if (mode < 0 || mode > SkXfermode::kLastMode) { + mode = SkXfermode::kModulate_Mode; + } + xfer.reset(SkXfermode::Create((SkXfermode::Mode)mode)); + } + canvas.drawVertices(vmode, vCount, verts, texs, colors, xfer, indices, iCount, paint); } break; case RESTORE: diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 6b49620..b7508b3 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -1189,7 +1189,7 @@ void SkPictureRecord::drawPicture(SkPicture& picture) { void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], - const SkColor colors[], SkXfermode*, + const SkColor colors[], SkXfermode* xfer, const uint16_t indices[], int indexCount, const SkPaint& paint) { uint32_t flags = 0; @@ -1202,6 +1202,12 @@ void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, if (indexCount > 0) { flags |= DRAW_VERTICES_HAS_INDICES; } + if (NULL != xfer) { + SkXfermode::Mode mode; + if (xfer->asMode(&mode) && SkXfermode::kModulate_Mode != mode) { + flags |= DRAW_VERTICES_HAS_XFER; + } + } // op + paint index + flags + vmode + vCount + vertices uint32_t size = 5 * kUInt32Size + vertexCount * sizeof(SkPoint); @@ -1215,6 +1221,9 @@ void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, // + num indices + indices size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); } + if (flags & DRAW_VERTICES_HAS_XFER) { + size += kUInt32Size; // mode enum + } size_t initialOffset = this->addDraw(DRAW_VERTICES, &size); SkASSERT(initialOffset+getPaintOffset(DRAW_VERTICES, size) == fWriter.bytesWritten()); @@ -1233,6 +1242,11 @@ void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, addInt(indexCount); fWriter.writePad(indices, indexCount * sizeof(uint16_t)); } + if (flags & DRAW_VERTICES_HAS_XFER) { + SkXfermode::Mode mode = SkXfermode::kModulate_Mode; + (void)xfer->asMode(&mode); + addInt(mode); + } this->validate(initialOffset, size); } diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 6625a8e..a9ad49e 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -1341,7 +1341,7 @@ void SkPDFDevice::drawVertices(const SkDraw& d, SkCanvas::VertexMode, if (d.fClip->isEmpty()) { return; } - NOT_IMPLEMENTED("drawVerticies", true); + // TODO: implement drawVertices } void SkPDFDevice::drawDevice(const SkDraw& d, SkBaseDevice* device, diff --git a/src/pipe/SkGPipePriv.h b/src/pipe/SkGPipePriv.h index 66b4366..d1970c4 100644 --- a/src/pipe/SkGPipePriv.h +++ b/src/pipe/SkGPipePriv.h @@ -142,6 +142,7 @@ enum { kDrawVertices_HasTexs_DrawOpFlag = 1 << 0, kDrawVertices_HasColors_DrawOpFlag = 1 << 1, kDrawVertices_HasIndices_DrawOpFlag = 1 << 2, + kDrawVertices_HasXfermode_DrawOpFlag = 1 << 3, }; enum { kDrawBitmap_HasPaint_DrawOpFlag = 1 << 0, diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp index 877d380..fc5ab5a 100644 --- a/src/pipe/SkGPipeRead.cpp +++ b/src/pipe/SkGPipeRead.cpp @@ -409,7 +409,7 @@ static void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { unsigned flags = DrawOp_unpackFlags(op32); - SkCanvas::VertexMode mode = (SkCanvas::VertexMode)reader->readU32(); + SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readU32(); int vertexCount = reader->readU32(); const SkPoint* verts = skip(reader, vertexCount); @@ -423,8 +423,11 @@ static void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, colors = skip(reader, vertexCount); } - // TODO: flatten/unflatten xfermodes - SkXfermode* xfer = NULL; + SkAutoTUnref xfer; + if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { + SkXfermode::Mode mode = (SkXfermode::Mode)reader->readU32(); + xfer.reset(SkXfermode::Create(mode)); + } int indexCount = 0; const uint16_t* indices = NULL; @@ -433,7 +436,7 @@ static void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, indices = skipAlign(reader, indexCount); } if (state->shouldDraw()) { - canvas->drawVertices(mode, vertexCount, verts, texs, colors, xfer, + canvas->drawVertices(vmode, vertexCount, verts, texs, colors, xfer, indices, indexCount, state->paint()); } } diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp index 4324080..0131ebb 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -928,9 +928,9 @@ void SkGPipeCanvas::drawPicture(SkPicture& picture) { this->INHERITED::drawPicture(picture); } -void SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, +void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], - const SkColor colors[], SkXfermode*, + const SkColor colors[], SkXfermode* xfer, const uint16_t indices[], int indexCount, const SkPaint& paint) { if (0 == vertexCount) { @@ -953,10 +953,14 @@ void SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, flags |= kDrawVertices_HasIndices_DrawOpFlag; size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); } + if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) { + flags |= kDrawVertices_HasXfermode_DrawOpFlag; + size += sizeof(int32_t); // mode enum + } if (this->needOpBytes(size)) { this->writeOp(kDrawVertices_DrawOp, flags, 0); - fWriter.write32(mode); + fWriter.write32(vmode); fWriter.write32(vertexCount); fWriter.write(vertices, vertexCount * sizeof(SkPoint)); if (texs) { @@ -965,9 +969,11 @@ void SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, if (colors) { fWriter.write(colors, vertexCount * sizeof(SkColor)); } - - // TODO: flatten xfermode - + if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { + SkXfermode::Mode mode = SkXfermode::kModulate_Mode; + (void)xfer->asMode(&mode); + fWriter.write32(mode); + } if (indices && indexCount > 0) { fWriter.write32(indexCount); fWriter.writePad(indices, indexCount * sizeof(uint16_t)); -- 2.7.4