| Index: src/pipe/SkGPipeWrite.cpp
|
| diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
|
| index 82848f8a6ff1af1aa7b81b6147f791c658bcb4b3..b78c291d2399ca16c3149adb33ef71ceb7241492 100644
|
| --- a/src/pipe/SkGPipeWrite.cpp
|
| +++ b/src/pipe/SkGPipeWrite.cpp
|
| @@ -366,7 +366,7 @@ void SkGPipeCanvas::flattenFactoryNames() {
|
| const char* name;
|
| while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) {
|
| size_t len = strlen(name);
|
| - if (this->needOpBytes(len)) {
|
| + if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) {
|
| this->writeOp(kDef_Factory_DrawOp);
|
| fWriter.writeString(name, len);
|
| }
|
| @@ -474,12 +474,13 @@ bool SkGPipeCanvas::needOpBytes(size_t needed) {
|
| }
|
|
|
| needed += 4; // size of DrawOp atom
|
| + needed = SkTMax<size_t>(MIN_BLOCK_SIZE, needed);
|
| + needed = SkAlign4(needed);
|
| if (fWriter.bytesWritten() + needed > fBlockSize) {
|
| // Before we wipe out any data that has already been written, read it
|
| // out.
|
| this->doNotify();
|
| - size_t blockSize = SkTMax<size_t>(MIN_BLOCK_SIZE, needed);
|
| - void* block = fController->requestBlock(blockSize, &fBlockSize);
|
| + void* block = fController->requestBlock(needed, &fBlockSize);
|
| if (NULL == block) {
|
| // Do not notify the readers, which would call this function again.
|
| this->finish(false);
|
| @@ -936,9 +937,15 @@ void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount,
|
| }
|
|
|
| NOTIFY_SETUP(this);
|
| - size_t size = 4 + vertexCount * sizeof(SkPoint);
|
| this->writePaint(paint);
|
| - unsigned flags = 0;
|
| +
|
| + unsigned flags = 0; // packs with the op, so needs no extra space
|
| +
|
| + size_t size = 0;
|
| + size += 4; // vmode
|
| + size += 4; // vertex count
|
| + size += vertexCount * sizeof(SkPoint); // vertices
|
| +
|
| if (texs) {
|
| flags |= kDrawVertices_HasTexs_DrawOpFlag;
|
| size += vertexCount * sizeof(SkPoint);
|
| @@ -947,13 +954,14 @@ void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount,
|
| flags |= kDrawVertices_HasColors_DrawOpFlag;
|
| size += vertexCount * sizeof(SkColor);
|
| }
|
| - if (indices && indexCount > 0) {
|
| - 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
|
| + size += sizeof(int32_t); // SkXfermode::Mode
|
| + }
|
| + if (indices && indexCount > 0) {
|
| + flags |= kDrawVertices_HasIndices_DrawOpFlag;
|
| + size += 4; // index count
|
| + size += SkAlign4(indexCount * sizeof(uint16_t)); // indices
|
| }
|
|
|
| if (this->needOpBytes(size)) {
|
| @@ -961,18 +969,18 @@ void SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount,
|
| fWriter.write32(vmode);
|
| fWriter.write32(vertexCount);
|
| fWriter.write(vertices, vertexCount * sizeof(SkPoint));
|
| - if (texs) {
|
| + if (flags & kDrawVertices_HasTexs_DrawOpFlag) {
|
| fWriter.write(texs, vertexCount * sizeof(SkPoint));
|
| }
|
| - if (colors) {
|
| + if (flags & kDrawVertices_HasColors_DrawOpFlag) {
|
| fWriter.write(colors, vertexCount * sizeof(SkColor));
|
| }
|
| if (flags & kDrawVertices_HasXfermode_DrawOpFlag) {
|
| SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
|
| - (void)xfer->asMode(&mode);
|
| + SkAssertResult(xfer->asMode(&mode));
|
| fWriter.write32(mode);
|
| }
|
| - if (indices && indexCount > 0) {
|
| + if (flags & kDrawVertices_HasIndices_DrawOpFlag) {
|
| fWriter.write32(indexCount);
|
| fWriter.writePad(indices, indexCount * sizeof(uint16_t));
|
| }
|
| @@ -1009,7 +1017,7 @@ void SkGPipeCanvas::endCommentGroup() {
|
| }
|
|
|
| void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) {
|
| - doNotify();
|
| + this->doNotify();
|
| if (detachCurrentBlock) {
|
| // force a new block to be requested for the next recorded command
|
| fBlockSize = 0;
|
|
|