Home | History | Annotate | Download | only in core
      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