1 /*
2  * Copyright 2018 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "SkAutoMalloc.h"
9 #include "SkCanvasPriv.h"
10 #include "SkReadBuffer.h"
11 #include "SkWriter32.h"
12 
13 SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatrix* matrix,
14                                                  const SkPaint* paint, const SkRect& bounds)
15 : fCanvas(canvas)
16 , fSaveCount(canvas->getSaveCount())
17 {
18     if (paint) {
19         SkRect newBounds = bounds;
20         if (matrix) {
21             matrix->mapRect(&newBounds);
22         }
23         canvas->saveLayer(&newBounds, paint);
24     } else if (matrix) {
25         canvas->save();
26     }
27 
28     if (matrix) {
29         canvas->concat(*matrix);
30     }
31 }
32 
33 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
34     fCanvas->restoreToCount(fSaveCount);
35 }
36 
37 ///////////////////////////////////////////////////////////////////////////////////////////////////
38 
39 bool SkCanvasPriv::ReadLattice(SkReadBuffer& buffer, SkCanvas::Lattice* lattice) {
40     lattice->fXCount = buffer.readInt();
41     lattice->fXDivs = buffer.skipT<int32_t>(lattice->fXCount);
42     lattice->fYCount = buffer.readInt();
43     lattice->fYDivs = buffer.skipT<int32_t>(lattice->fYCount);
44     int flagCount = buffer.readInt();
45     lattice->fRectTypes = nullptr;
46     lattice->fColors = nullptr;
47     if (flagCount) {
48         lattice->fRectTypes = buffer.skipT<SkCanvas::Lattice::RectType>(flagCount);
49         lattice->fColors = buffer.skipT<SkColor>(flagCount);
50     }
51     lattice->fBounds = buffer.skipT<SkIRect>();
52     return buffer.isValid();
53 }
54 
55 size_t SkCanvasPriv::WriteLattice(void* buffer, const SkCanvas::Lattice& lattice) {
56     int flagCount = lattice.fRectTypes ? (lattice.fXCount + 1) * (lattice.fYCount + 1) : 0;
57 
58     const size_t size = (1 + lattice.fXCount + 1 + lattice.fYCount + 1) * sizeof(int32_t) +
59                         SkAlign4(flagCount * sizeof(SkCanvas::Lattice::RectType)) +
60                         SkAlign4(flagCount * sizeof(SkColor)) +
61                         sizeof(SkIRect);
62 
63     if (buffer) {
64         SkWriter32 writer(buffer, size);
65         writer.write32(lattice.fXCount);
66         writer.write(lattice.fXDivs, lattice.fXCount * sizeof(uint32_t));
67         writer.write32(lattice.fYCount);
68         writer.write(lattice.fYDivs, lattice.fYCount * sizeof(uint32_t));
69         writer.write32(flagCount);
70         writer.writePad(lattice.fRectTypes, flagCount * sizeof(uint8_t));
71         writer.write(lattice.fColors, flagCount * sizeof(SkColor));
72         SkASSERT(lattice.fBounds);
73         writer.write(lattice.fBounds, sizeof(SkIRect));
74         SkASSERT(writer.bytesWritten() == size);
75     }
76     return size;
77 };
78 
79 void SkCanvasPriv::WriteLattice(SkWriteBuffer& buffer, const SkCanvas::Lattice& lattice) {
80     const size_t size = WriteLattice(nullptr, lattice);
81     SkAutoSMalloc<1024> storage(size);
82     WriteLattice(storage.get(), lattice);
83     buffer.writePad32(storage.get(), size);
84 }
85 
86