/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/core/SkAutoMalloc.h" #include "src/core/SkCanvasPriv.h" #include "src/core/SkReadBuffer.h" #include "src/core/SkWriter32.h" SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatrix* matrix, const SkPaint* paint, const SkRect& bounds) : fCanvas(canvas) , fSaveCount(canvas->getSaveCount()) { if (paint) { SkRect newBounds = bounds; if (matrix) { matrix->mapRect(&newBounds); } canvas->saveLayer(&newBounds, paint); } else if (matrix) { canvas->save(); } if (matrix) { canvas->concat(*matrix); } } SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { fCanvas->restoreToCount(fSaveCount); } /////////////////////////////////////////////////////////////////////////////////////////////////// bool SkCanvasPriv::ReadLattice(SkReadBuffer& buffer, SkCanvas::Lattice* lattice) { lattice->fXCount = buffer.readInt(); lattice->fXDivs = buffer.skipT(lattice->fXCount); lattice->fYCount = buffer.readInt(); lattice->fYDivs = buffer.skipT(lattice->fYCount); int flagCount = buffer.readInt(); lattice->fRectTypes = nullptr; lattice->fColors = nullptr; if (flagCount) { lattice->fRectTypes = buffer.skipT(flagCount); lattice->fColors = buffer.skipT(flagCount); } lattice->fBounds = buffer.skipT(); return buffer.isValid(); } size_t SkCanvasPriv::WriteLattice(void* buffer, const SkCanvas::Lattice& lattice) { int flagCount = lattice.fRectTypes ? (lattice.fXCount + 1) * (lattice.fYCount + 1) : 0; const size_t size = (1 + lattice.fXCount + 1 + lattice.fYCount + 1) * sizeof(int32_t) + SkAlign4(flagCount * sizeof(SkCanvas::Lattice::RectType)) + SkAlign4(flagCount * sizeof(SkColor)) + sizeof(SkIRect); if (buffer) { SkWriter32 writer(buffer, size); writer.write32(lattice.fXCount); writer.write(lattice.fXDivs, lattice.fXCount * sizeof(uint32_t)); writer.write32(lattice.fYCount); writer.write(lattice.fYDivs, lattice.fYCount * sizeof(uint32_t)); writer.write32(flagCount); writer.writePad(lattice.fRectTypes, flagCount * sizeof(uint8_t)); writer.write(lattice.fColors, flagCount * sizeof(SkColor)); SkASSERT(lattice.fBounds); writer.write(lattice.fBounds, sizeof(SkIRect)); SkASSERT(writer.bytesWritten() == size); } return size; }; void SkCanvasPriv::WriteLattice(SkWriteBuffer& buffer, const SkCanvas::Lattice& lattice) { const size_t size = WriteLattice(nullptr, lattice); SkAutoSMalloc<1024> storage(size); WriteLattice(storage.get(), lattice); buffer.writePad32(storage.get(), size); } void SkCanvasPriv::GetDstClipAndMatrixCounts(const SkCanvas::ImageSetEntry set[], int count, int* totalDstClipCount, int* totalMatrixCount) { int dstClipCount = 0; int maxMatrixIndex = -1; for (int i = 0; i < count; ++i) { dstClipCount += 4 * set[i].fHasClip; if (set[i].fMatrixIndex > maxMatrixIndex) { maxMatrixIndex = set[i].fMatrixIndex; } } *totalDstClipCount = dstClipCount; *totalMatrixCount = maxMatrixIndex + 1; }