diff options
-rw-r--r-- | include/core/SkCanvas.h | 10 | ||||
-rw-r--r-- | include/private/SkRecords.h | 11 | ||||
-rw-r--r-- | include/utils/SkDumpCanvas.h | 6 | ||||
-rw-r--r-- | include/utils/SkLuaCanvas.h | 6 | ||||
-rw-r--r-- | include/utils/SkNoDrawCanvas.h | 5 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 25 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 4 | ||||
-rw-r--r-- | src/core/SkDevice.h | 3 | ||||
-rw-r--r-- | src/core/SkLiteDL.cpp | 17 | ||||
-rw-r--r-- | src/core/SkLiteDL.h | 1 | ||||
-rw-r--r-- | src/core/SkLiteRecorder.cpp | 4 | ||||
-rw-r--r-- | src/core/SkLiteRecorder.h | 1 | ||||
-rw-r--r-- | src/core/SkPictureData.cpp | 33 | ||||
-rw-r--r-- | src/core/SkPictureData.h | 8 | ||||
-rw-r--r-- | src/core/SkPictureFlat.h | 3 | ||||
-rw-r--r-- | src/core/SkPicturePlayback.cpp | 15 | ||||
-rw-r--r-- | src/core/SkPictureRecord.cpp | 66 | ||||
-rw-r--r-- | src/core/SkPictureRecord.h | 13 | ||||
-rw-r--r-- | src/core/SkRecordDraw.cpp | 7 | ||||
-rw-r--r-- | src/core/SkRecorder.cpp | 16 | ||||
-rw-r--r-- | src/core/SkRecorder.h | 1 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 6 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 3 | ||||
-rw-r--r-- | tools/debugger/SkDebugCanvas.h | 6 |
24 files changed, 154 insertions, 116 deletions
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index 81841ba2b4..85531bb74a 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -1186,9 +1186,9 @@ public: shader. In this case the colors are combined with the texture using mode, before being drawn using the paint. @param paint Specifies the shader/texture if present. - @param flags Allows the caller to ignore colors or texs on vertices. */ - void drawVertices(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint); + void drawVertices(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint); + void drawVertices(const sk_sp<SkVertices>& vertices, SkBlendMode mode, const SkPaint& paint); /** Draw a cubic coons patch @@ -1445,12 +1445,10 @@ protected: virtual void onDrawVertices(VertexMode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&); - virtual void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, - const SkPaint& paint, uint32_t flags); + virtual void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&); // Subclasses can use this put the vertices object call on the regular draw vertices code path. // This is temporary until we teach recording and other SkCanvas classes about SkVertices. - void onDrawVerticesObjectFallback(sk_sp<SkVertices> vertices, SkBlendMode mode, - const SkPaint& paint, uint32_t flags); + void devolveSkVerticesToRaw(const SkVertices*, SkBlendMode, const SkPaint&); virtual void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int count, SkBlendMode, const SkRect* cull, const SkPaint*); diff --git a/include/private/SkRecords.h b/include/private/SkRecords.h index b81bca87ee..ac492ec0ea 100644 --- a/include/private/SkRecords.h +++ b/include/private/SkRecords.h @@ -21,6 +21,7 @@ #include "SkRSXform.h" #include "SkString.h" #include "SkTextBlob.h" +#include "SkVertices.h" // Windows.h, will pull in all of the GDI defines. GDI #defines // DrawText to DrawTextA or DrawTextW, but SkRecord has a struct @@ -345,14 +346,8 @@ RECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag, Optional<SkRect> cull); RECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag, SkPaint paint; - SkCanvas::VertexMode vmode; - int vertexCount; - PODArray<SkPoint> vertices; - PODArray<SkPoint> texs; - PODArray<SkColor> colors; - SkBlendMode bmode; - PODArray<uint16_t> indices; - int indexCount); + sk_sp<SkVertices> vertices; + SkBlendMode bmode); RECORD(DrawAnnotation, 0, // TODO: kDraw_Tag, skia:5548 SkRect rect; SkString key; diff --git a/include/utils/SkDumpCanvas.h b/include/utils/SkDumpCanvas.h index 79a49bcd3b..19e5da567d 100644 --- a/include/utils/SkDumpCanvas.h +++ b/include/utils/SkDumpCanvas.h @@ -117,9 +117,9 @@ protected: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; - void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint, - uint32_t flags) override { - this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags); + void onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) override { + this->devolveSkVerticesToRaw(vertices, mode, paint); } void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; diff --git a/include/utils/SkLuaCanvas.h b/include/utils/SkLuaCanvas.h index ce374137c0..a11d72f26c 100644 --- a/include/utils/SkLuaCanvas.h +++ b/include/utils/SkLuaCanvas.h @@ -63,9 +63,9 @@ protected: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; - void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint, - uint32_t flags) override { - this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags); + void onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) override { + this->devolveSkVerticesToRaw(vertices, mode, paint); } void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; diff --git a/include/utils/SkNoDrawCanvas.h b/include/utils/SkNoDrawCanvas.h index 14b85549f4..75c15b201e 100644 --- a/include/utils/SkNoDrawCanvas.h +++ b/include/utils/SkNoDrawCanvas.h @@ -68,10 +68,7 @@ protected: const SkPaint*) override {} void onDrawVertices(VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[], SkBlendMode, const uint16_t[], int, const SkPaint&) override {} - void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint, - uint32_t flags) override { - this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags); - } + void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override {} void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkRect*, const SkPaint*) override {} diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 23aed12b3b..ccdb71b5a0 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1799,10 +1799,15 @@ void SkCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint ver indexCount, paint); } -void SkCanvas::drawVertices(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint) { +void SkCanvas::drawVertices(const sk_sp<SkVertices>& vertices, SkBlendMode mode, + const SkPaint& paint) { + RETURN_ON_NULL(vertices); + this->onDrawVerticesObject(vertices.get(), mode, paint); +} + +void SkCanvas::drawVertices(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint) { RETURN_ON_NULL(vertices); - uint32_t deprecatedFlags = 0; - this->onDrawVerticesObject(std::move(vertices), mode, paint, deprecatedFlags); + this->onDrawVerticesObject(vertices, mode, paint); } void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { @@ -2671,24 +2676,24 @@ void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount, LOOPER_END } -void SkCanvas::onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode bmode, - const SkPaint& paint, uint32_t flags) { +void SkCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmode, + const SkPaint& paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()"); LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr) while (iter.next()) { // In the common case of one iteration we could std::move vertices here. - iter.fDevice->drawVerticesObject(vertices, bmode, looper.paint(), flags); + iter.fDevice->drawVerticesObject(vertices, bmode, looper.paint()); } LOOPER_END } -void SkCanvas::onDrawVerticesObjectFallback(sk_sp<SkVertices> vertices, SkBlendMode mode, - const SkPaint& paint, uint32_t deprecatedFlags) { +void SkCanvas::devolveSkVerticesToRaw(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) { this->onDrawVertices(vertices->mode(), vertices->vertexCount(), vertices->positions(), - vertices->texCoords(), vertices->colors(), mode, vertices->indices(), - vertices->indexCount(), paint); + vertices->texCoords(), vertices->colors(), mode, + vertices->indices(), vertices->indexCount(), paint); } void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4], diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index eb507d402b..44c9dfb75c 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -276,8 +276,8 @@ void SkBaseDevice::drawAtlas(const SkImage* atlas, const SkRSXform xform[], } } -void SkBaseDevice::drawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, - const SkPaint& paint, uint32_t deprecatedFlags) { +void SkBaseDevice::drawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) { this->drawVertices(vertices->mode(), vertices->vertexCount(), vertices->positions(), vertices->texCoords(), vertices->colors(), mode, vertices->indices(), vertices->indexCount(), paint); diff --git a/src/core/SkDevice.h b/src/core/SkDevice.h index a8a68b6016..6267b4451d 100644 --- a/src/core/SkDevice.h +++ b/src/core/SkDevice.h @@ -238,8 +238,7 @@ protected: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint& paint) = 0; - virtual void drawVerticesObject(sk_sp<SkVertices>, SkBlendMode, const SkPaint&, - uint32_t flags); + virtual void drawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&); // default implementation unrolls the blob runs. virtual void drawTextBlob(const SkTextBlob*, SkScalar x, SkScalar y, const SkPaint& paint, SkDrawFilter* drawFilter); diff --git a/src/core/SkLiteDL.cpp b/src/core/SkLiteDL.cpp index b990c70b1a..2da6eb5ef6 100644 --- a/src/core/SkLiteDL.cpp +++ b/src/core/SkLiteDL.cpp @@ -15,6 +15,7 @@ #include "SkRegion.h" #include "SkRSXform.h" #include "SkTextBlob.h" +#include "SkVertices.h" #ifndef SKLITEDL_PAGE #define SKLITEDL_PAGE 4096 @@ -54,7 +55,7 @@ namespace { M(DrawImage) M(DrawImageNine) M(DrawImageRect) M(DrawImageLattice) \ M(DrawText) M(DrawPosText) M(DrawPosTextH) \ M(DrawTextOnPath) M(DrawTextRSXform) M(DrawTextBlob) \ - M(DrawPatch) M(DrawPoints) M(DrawVertices) M(DrawAtlas) + M(DrawPatch) M(DrawPoints) M(DrawVertices) M(DrawVerticesObject) M(DrawAtlas) #define M(T) T, enum class Type : uint8_t { TYPES(M) }; @@ -502,6 +503,17 @@ namespace { indices, nindices, paint); } }; + struct DrawVerticesObject final : Op { + static const auto kType = Type::DrawVerticesObject; + DrawVerticesObject(const SkVertices* v, SkBlendMode m, const SkPaint& p) + : vertices(sk_ref_sp(const_cast<SkVertices*>(v))), mode(m), paint(p) {} + sk_sp<SkVertices> vertices; + SkBlendMode mode; + SkPaint paint; + void draw(SkCanvas* c, const SkMatrix&) { + c->drawVertices(vertices, mode, paint); + } + }; struct DrawAtlas final : Op { static const auto kType = Type::DrawAtlas; DrawAtlas(const SkImage* atlas, int count, SkBlendMode xfermode, @@ -714,6 +726,9 @@ void SkLiteDL::drawVertices(SkCanvas::VertexMode mode, int count, const SkPoint colors, colors ? count : 0, indices, indices ? nindices : 0); } +void SkLiteDL::drawVertices(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint) { + this->push<DrawVerticesObject>(0, vertices, mode, paint); +} void SkLiteDL::drawAtlas(const SkImage* atlas, const SkRSXform xforms[], const SkRect texs[], const SkColor colors[], int count, SkBlendMode xfermode, const SkRect* cull, const SkPaint* paint) { diff --git a/src/core/SkLiteDL.h b/src/core/SkLiteDL.h index 2e1b8cce5d..bc5f4e701e 100644 --- a/src/core/SkLiteDL.h +++ b/src/core/SkLiteDL.h @@ -76,6 +76,7 @@ public: void drawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&); void drawVertices(SkCanvas::VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[], SkBlendMode, const uint16_t[], int, const SkPaint&); + void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&); void drawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkRect*, const SkPaint*); diff --git a/src/core/SkLiteRecorder.cpp b/src/core/SkLiteRecorder.cpp index b3314b0c2a..a01ac655e7 100644 --- a/src/core/SkLiteRecorder.cpp +++ b/src/core/SkLiteRecorder.cpp @@ -187,6 +187,10 @@ void SkLiteRecorder::onDrawVertices(SkCanvas::VertexMode mode, const SkPaint& paint) { fDL->drawVertices(mode, count, vertices, texs, colors, bmode, indices, indexCount, paint); } +void SkLiteRecorder::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) { + fDL->drawVertices(vertices, mode, paint); +} void SkLiteRecorder::onDrawAtlas(const SkImage* atlas, const SkRSXform xforms[], const SkRect texs[], diff --git a/src/core/SkLiteRecorder.h b/src/core/SkLiteRecorder.h index 4de978943f..82aeca385a 100644 --- a/src/core/SkLiteRecorder.h +++ b/src/core/SkLiteRecorder.h @@ -76,6 +76,7 @@ public: void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; void onDrawVertices(VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[], SkBlendMode, const uint16_t[], int, const SkPaint&) override; + void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkRect*, const SkPaint*) override; diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp index 9780b7d104..69ff736fcf 100644 --- a/src/core/SkPictureData.cpp +++ b/src/core/SkPictureData.cpp @@ -87,6 +87,15 @@ SkPictureData::SkPictureData(const SkPictureRecord& record, } } + const SkTDArray<const SkVertices*>& verts = record.getVerticesRefs(); + fVerticesCount = verts.count(); + if (fVerticesCount > 0) { + fVerticesRefs = new const SkVertices* [fVerticesCount]; + for (int i = 0; i < fVerticesCount; ++i) { + fVerticesRefs[i] = SkRef(verts[i]); + } + } + const SkTDArray<const SkImage*>& imgs = record.getImageRefs(); fImageCount = imgs.count(); if (fImageCount > 0) { @@ -104,6 +113,8 @@ void SkPictureData::init() { fDrawableCount = 0; fTextBlobRefs = nullptr; fTextBlobCount = 0; + fVerticesRefs = nullptr; + fVerticesCount = 0; fImageRefs = nullptr; fImageCount = 0; fFactoryPlayback = nullptr; @@ -128,6 +139,11 @@ SkPictureData::~SkPictureData() { } delete[] fTextBlobRefs; + for (int i = 0; i < fVerticesCount; i++) { + fVerticesRefs[i]->unref(); + } + delete[] fVerticesRefs; + for (int i = 0; i < fImageCount; i++) { fImageRefs[i]->unref(); } @@ -247,6 +263,13 @@ void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const { } } + if (fVerticesCount > 0) { + write_tag_size(buffer, SK_PICT_VERTICES_BUFFER_TAG, fVerticesCount); + for (i = 0; i < fVerticesCount; ++i) { + buffer.writeDataAsByteArray(fVerticesRefs[i]->encode().get()); + } + } + if (fImageCount > 0) { write_tag_size(buffer, SK_PICT_IMAGE_BUFFER_TAG, fImageCount); for (i = 0; i < fImageCount; ++i) { @@ -464,6 +487,10 @@ bool SkPictureData::parseStreamTag(SkStream* stream, static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { return buffer.readImage().release(); } +static const SkVertices* create_vertices_from_buffer(SkReadBuffer& buffer) { + auto data = buffer.readByteArrayAsData(); + return data ? SkVertices::Decode(data->data(), data->size()).release() : nullptr; +} static const SkImage* create_bitmap_image_from_buffer(SkReadBuffer& buffer) { return buffer.readBitmapAsImage().release(); @@ -549,6 +576,12 @@ bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t return false; } break; + case SK_PICT_VERTICES_BUFFER_TAG: + if (!new_array_from_buffer(buffer, size, &fVerticesRefs, &fVerticesCount, + create_vertices_from_buffer)) { + return false; + } + break; case SK_PICT_IMAGE_BUFFER_TAG: if (!new_array_from_buffer(buffer, size, &fImageRefs, &fImageCount, create_image_from_buffer)) { diff --git a/src/core/SkPictureData.h b/src/core/SkPictureData.h index 332b799638..37a02373be 100644 --- a/src/core/SkPictureData.h +++ b/src/core/SkPictureData.h @@ -68,6 +68,7 @@ public: #define SK_PICT_PAINT_BUFFER_TAG SkSetFourByteTag('p', 'n', 't', ' ') #define SK_PICT_PATH_BUFFER_TAG SkSetFourByteTag('p', 't', 'h', ' ') #define SK_PICT_TEXTBLOB_BUFFER_TAG SkSetFourByteTag('b', 'l', 'o', 'b') +#define SK_PICT_VERTICES_BUFFER_TAG SkSetFourByteTag('v', 'e', 'r', 't') #define SK_PICT_IMAGE_BUFFER_TAG SkSetFourByteTag('i', 'm', 'a', 'g') // Always write this guy last (with no length field afterwards) @@ -143,6 +144,11 @@ public: return reader->validateIndex(index, fTextBlobCount) ? fTextBlobRefs[index] : nullptr; } + const SkVertices* getVertices(SkReadBuffer* reader) const { + const int index = reader->readInt() - 1; + return reader->validateIndex(index, fVerticesCount) ? fVerticesRefs[index] : nullptr; + } + #if SK_SUPPORT_GPU /** * sampleCount is the number of samples-per-pixel or zero if non-MSAA. @@ -185,6 +191,8 @@ private: int fDrawableCount; const SkTextBlob** fTextBlobRefs; int fTextBlobCount; + const SkVertices** fVerticesRefs; + int fVerticesCount; const SkImage** fImageRefs; int fImageCount; const SkImage** fBitmapImageRefs; diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h index f5b20ca66c..ac1483d4a1 100644 --- a/src/core/SkPictureFlat.h +++ b/src/core/SkPictureFlat.h @@ -93,8 +93,9 @@ enum DrawType { DRAW_IMAGE_LATTICE, DRAW_ARC, DRAW_REGION, + DRAW_VERTICES_OBJECT, - LAST_DRAWTYPE_ENUM = DRAW_REGION + LAST_DRAWTYPE_ENUM = DRAW_VERTICES_OBJECT }; // In the 'match' method, this constant will match any flavor of DRAW_BITMAP* diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp index be2e5dbe04..26dc38bef8 100644 --- a/src/core/SkPicturePlayback.cpp +++ b/src/core/SkPicturePlayback.cpp @@ -678,8 +678,19 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader, BREAK_ON_READ_ERROR(reader); if (paint) { - canvas->drawVertices(vmode, vCount, verts, texs, colors, - bmode, indices, iCount, *paint); + canvas->drawVertices(SkVertices::MakeCopy(vmode, vCount, verts, texs, colors, + iCount, indices), bmode, *paint); + } + } break; + case DRAW_VERTICES_OBJECT: { + const SkPaint* paint = fPictureData->getPaint(reader); + const SkVertices* vertices = fPictureData->getVertices(reader); + SkBlendMode bmode = static_cast<SkBlendMode>(reader->readInt()); + + BREAK_ON_READ_ERROR(reader); + + if (paint && vertices) { + canvas->drawVertices(vertices, bmode, *paint); } } break; case RESTORE: diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 98677dd5eb..1639cff863 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -722,59 +722,26 @@ void SkPictureRecord::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matri } void SkPictureRecord::onDrawVertices(VertexMode vmode, int vertexCount, - const SkPoint vertices[], const SkPoint texs[], - const SkColor colors[], SkBlendMode bmode, + const SkPoint pos[], const SkPoint texs[], + const SkColor cols[], SkBlendMode bmode, const uint16_t indices[], int indexCount, const SkPaint& paint) { - uint32_t flags = 0; - if (texs) { - flags |= DRAW_VERTICES_HAS_TEXS; - } - if (colors) { - flags |= DRAW_VERTICES_HAS_COLORS; - } - if (indexCount > 0) { - flags |= DRAW_VERTICES_HAS_INDICES; - } - if (SkBlendMode::kModulate != bmode) { - flags |= DRAW_VERTICES_HAS_XFER; + auto vertices = SkVertices::MakeCopy(vmode, vertexCount, pos, texs, cols, indexCount, indices); + if (vertices) { + this->onDrawVerticesObject(vertices.get(), bmode, paint); } +} - // op + paint index + flags + vmode + vCount + vertices - size_t size = 5 * kUInt32Size + vertexCount * sizeof(SkPoint); - if (flags & DRAW_VERTICES_HAS_TEXS) { - size += vertexCount * sizeof(SkPoint); // + uvs - } - if (flags & DRAW_VERTICES_HAS_COLORS) { - size += vertexCount * sizeof(SkColor); // + vert colors - } - if (flags & DRAW_VERTICES_HAS_INDICES) { - // + num indices + indices - size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); - } - if (flags & DRAW_VERTICES_HAS_XFER) { - size += kUInt32Size; // mode enum - } +void SkPictureRecord::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) { + // op + paint index + vertices index + mode + size_t size = 4 * kUInt32Size; + size_t initialOffset = this->addDraw(DRAW_VERTICES_OBJECT, &size); - size_t initialOffset = this->addDraw(DRAW_VERTICES, &size); this->addPaint(paint); - this->addInt(flags); - this->addInt(vmode); - this->addInt(vertexCount); - this->addPoints(vertices, vertexCount); - if (flags & DRAW_VERTICES_HAS_TEXS) { - this->addPoints(texs, vertexCount); - } - if (flags & DRAW_VERTICES_HAS_COLORS) { - fWriter.writeMul4(colors, vertexCount * sizeof(SkColor)); - } - if (flags & DRAW_VERTICES_HAS_INDICES) { - this->addInt(indexCount); - fWriter.writePad(indices, indexCount * sizeof(uint16_t)); - } - if (flags & DRAW_VERTICES_HAS_XFER) { - this->addInt((int)bmode); - } + this->addVertices(vertices); + this->addInt(static_cast<uint32_t>(mode)); + this->validate(initialOffset, size); } @@ -984,4 +951,9 @@ void SkPictureRecord::addTextBlob(const SkTextBlob* blob) { this->addInt(find_or_append_uniqueID(fTextBlobRefs, blob) + 1); } +void SkPictureRecord::addVertices(const SkVertices* vertices) { + // follow the convention of recording a 1-based index + this->addInt(find_or_append_uniqueID(fVerticesRefs, vertices) + 1); +} + /////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h index 587233c298..197684e347 100644 --- a/src/core/SkPictureRecord.h +++ b/src/core/SkPictureRecord.h @@ -44,7 +44,11 @@ public: return fTextBlobRefs; } - const SkTDArray<const SkImage* >& getImageRefs() const { + const SkTDArray<const SkVertices* >& getVerticesRefs() const { + return fVerticesRefs; + } + + const SkTDArray<const SkImage* >& getImageRefs() const { return fImageRefs; } @@ -141,6 +145,7 @@ private: void addRegion(const SkRegion& region); void addText(const void* text, size_t byteLength); void addTextBlob(const SkTextBlob* blob); + void addVertices(const SkVertices*); int find(const SkBitmap& bitmap); @@ -204,10 +209,7 @@ protected: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; - void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint, - uint32_t flags) override { - this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags); - } + void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override; @@ -277,6 +279,7 @@ private: SkTDArray<const SkPicture*> fPictureRefs; SkTDArray<SkDrawable*> fDrawableRefs; SkTDArray<const SkTextBlob*> fTextBlobRefs; + SkTDArray<const SkVertices*> fVerticesRefs; uint32_t fRecordFlags; int fInitialSaveCount; diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp index 8ca3f06513..21f9de956b 100644 --- a/src/core/SkRecordDraw.cpp +++ b/src/core/SkRecordDraw.cpp @@ -134,8 +134,7 @@ DRAW(DrawTextOnPath, drawTextOnPath(r.text, r.byteLength, r.path, &r.matrix, r.p DRAW(DrawTextRSXform, drawTextRSXform(r.text, r.byteLength, r.xforms, r.cull, r.paint)); DRAW(DrawAtlas, drawAtlas(r.atlas.get(), r.xforms, r.texs, r.colors, r.count, r.mode, r.cull, r.paint)); -DRAW(DrawVertices, drawVertices(r.vmode, r.vertexCount, r.vertices, r.texs, r.colors, - r.bmode, r.indices, r.indexCount, r.paint)); +DRAW(DrawVertices, drawVertices(r.vertices, r.bmode, r.paint)); DRAW(DrawAnnotation, drawAnnotation(r.rect, r.key.c_str(), r.value.get())); #undef DRAW @@ -454,9 +453,7 @@ private: return this->adjustAndMap(dst, &op.paint); } Bounds bounds(const DrawVertices& op) const { - SkRect dst; - dst.set(op.vertices, op.vertexCount); - return this->adjustAndMap(dst, &op.paint); + return this->adjustAndMap(op.vertices->bounds(), &op.paint); } Bounds bounds(const DrawAtlas& op) const { diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp index fb0bda7e0b..9b38bcd2b3 100644 --- a/src/core/SkRecorder.cpp +++ b/src/core/SkRecorder.cpp @@ -331,15 +331,13 @@ void SkRecorder::onDrawVertices(VertexMode vmode, const SkPoint texs[], const SkColor colors[], SkBlendMode bmode, const uint16_t indices[], int indexCount, const SkPaint& paint) { - APPEND(DrawVertices, paint, - vmode, - vertexCount, - this->copy(vertices, vertexCount), - texs ? this->copy(texs, vertexCount) : nullptr, - colors ? this->copy(colors, vertexCount) : nullptr, - bmode, - this->copy(indices, indexCount), - indexCount); + this->onDrawVerticesObject(SkVertices::MakeCopy(vmode, vertexCount, vertices, texs, colors, + indexCount, indices).get(), bmode, paint); +} + +void SkRecorder::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmode, + const SkPaint& paint) { + APPEND(DrawVertices, paint, sk_ref_sp(const_cast<SkVertices*>(vertices)), bmode); } void SkRecorder::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], diff --git a/src/core/SkRecorder.h b/src/core/SkRecorder.h index b5a79039d7..c13344227e 100644 --- a/src/core/SkRecorder.h +++ b/src/core/SkRecorder.h @@ -129,6 +129,7 @@ public: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; + void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int count, SkBlendMode, const SkRect* cull, const SkPaint*) override; diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 637077764c..55f0f17b2f 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1664,8 +1664,8 @@ void SkGpuDevice::drawVertices(SkCanvas::VertexMode vmode, GrRenderTargetContext::ColorArrayType::kSkColor); } -void SkGpuDevice::drawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, - const SkPaint& paint, uint32_t deprecatedFlags) { +void SkGpuDevice::drawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) { ASSERT_SINGLE_OWNER CHECK_SHOULD_DRAW(); GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawVerticesObject", fContext.get()); @@ -1685,7 +1685,7 @@ void SkGpuDevice::drawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mod return; } fRenderTargetContext->drawVertices(this->clip(), std::move(grPaint), this->ctm(), - std::move(vertices)); + sk_ref_sp(const_cast<SkVertices*>(vertices))); } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 01bded4ffc..ed101f9bcf 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -92,8 +92,7 @@ public: void drawVertices(SkCanvas::VertexMode, int vertexCount, const SkPoint verts[], const SkPoint texs[], const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; - void drawVerticesObject(sk_sp<SkVertices>, SkBlendMode, const SkPaint&, - uint32_t flags) override; + void drawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; void drawAtlas(const SkImage* atlas, const SkRSXform[], const SkRect[], const SkColor[], int count, SkBlendMode, const SkPaint&) override; void drawDevice(SkBaseDevice*, int x, int y, const SkPaint&) override; diff --git a/tools/debugger/SkDebugCanvas.h b/tools/debugger/SkDebugCanvas.h index d25fe40274..2b15bbaf90 100644 --- a/tools/debugger/SkDebugCanvas.h +++ b/tools/debugger/SkDebugCanvas.h @@ -230,9 +230,9 @@ protected: const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint&) override; - void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint, - uint32_t flags) override { - this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags); + void onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) override { + this->devolveSkVerticesToRaw(vertices, mode, paint); } void onDrawPath(const SkPath&, const SkPaint&) override; void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; |