1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/core/SkCanvasPriv.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/core/SkAutoMalloc.h" 11cb93a386Sopenharmony_ci#include "src/core/SkDevice.h" 12cb93a386Sopenharmony_ci#include "src/core/SkReadBuffer.h" 13cb93a386Sopenharmony_ci#include "src/core/SkWriter32.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include <locale> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciSkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatrix* matrix, 18cb93a386Sopenharmony_ci const SkPaint* paint, const SkRect& bounds) 19cb93a386Sopenharmony_ci : fCanvas(canvas) 20cb93a386Sopenharmony_ci , fSaveCount(canvas->getSaveCount()) { 21cb93a386Sopenharmony_ci if (paint) { 22cb93a386Sopenharmony_ci SkRect newBounds = bounds; 23cb93a386Sopenharmony_ci if (matrix) { 24cb93a386Sopenharmony_ci matrix->mapRect(&newBounds); 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci canvas->saveLayer(&newBounds, paint); 27cb93a386Sopenharmony_ci } else if (matrix) { 28cb93a386Sopenharmony_ci canvas->save(); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci if (matrix) { 32cb93a386Sopenharmony_ci canvas->concat(*matrix); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci} 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ciSkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 37cb93a386Sopenharmony_ci fCanvas->restoreToCount(fSaveCount); 38cb93a386Sopenharmony_ci} 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_cibool SkCanvasPriv::ReadLattice(SkReadBuffer& buffer, SkCanvas::Lattice* lattice) { 43cb93a386Sopenharmony_ci lattice->fXCount = buffer.readInt(); 44cb93a386Sopenharmony_ci lattice->fXDivs = buffer.skipT<int32_t>(lattice->fXCount); 45cb93a386Sopenharmony_ci lattice->fYCount = buffer.readInt(); 46cb93a386Sopenharmony_ci lattice->fYDivs = buffer.skipT<int32_t>(lattice->fYCount); 47cb93a386Sopenharmony_ci int flagCount = buffer.readInt(); 48cb93a386Sopenharmony_ci lattice->fRectTypes = nullptr; 49cb93a386Sopenharmony_ci lattice->fColors = nullptr; 50cb93a386Sopenharmony_ci if (flagCount) { 51cb93a386Sopenharmony_ci lattice->fRectTypes = buffer.skipT<SkCanvas::Lattice::RectType>(flagCount); 52cb93a386Sopenharmony_ci lattice->fColors = buffer.skipT<SkColor>(flagCount); 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci lattice->fBounds = buffer.skipT<SkIRect>(); 55cb93a386Sopenharmony_ci return buffer.isValid(); 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_cisize_t SkCanvasPriv::WriteLattice(void* buffer, const SkCanvas::Lattice& lattice) { 59cb93a386Sopenharmony_ci int flagCount = lattice.fRectTypes ? (lattice.fXCount + 1) * (lattice.fYCount + 1) : 0; 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci const size_t size = (1 + lattice.fXCount + 1 + lattice.fYCount + 1) * sizeof(int32_t) + 62cb93a386Sopenharmony_ci SkAlign4(flagCount * sizeof(SkCanvas::Lattice::RectType)) + 63cb93a386Sopenharmony_ci SkAlign4(flagCount * sizeof(SkColor)) + 64cb93a386Sopenharmony_ci sizeof(SkIRect); 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci if (buffer) { 67cb93a386Sopenharmony_ci SkWriter32 writer(buffer, size); 68cb93a386Sopenharmony_ci writer.write32(lattice.fXCount); 69cb93a386Sopenharmony_ci writer.write(lattice.fXDivs, lattice.fXCount * sizeof(uint32_t)); 70cb93a386Sopenharmony_ci writer.write32(lattice.fYCount); 71cb93a386Sopenharmony_ci writer.write(lattice.fYDivs, lattice.fYCount * sizeof(uint32_t)); 72cb93a386Sopenharmony_ci writer.write32(flagCount); 73cb93a386Sopenharmony_ci writer.writePad(lattice.fRectTypes, flagCount * sizeof(uint8_t)); 74cb93a386Sopenharmony_ci writer.write(lattice.fColors, flagCount * sizeof(SkColor)); 75cb93a386Sopenharmony_ci SkASSERT(lattice.fBounds); 76cb93a386Sopenharmony_ci writer.write(lattice.fBounds, sizeof(SkIRect)); 77cb93a386Sopenharmony_ci SkASSERT(writer.bytesWritten() == size); 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci return size; 80cb93a386Sopenharmony_ci}; 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_civoid SkCanvasPriv::WriteLattice(SkWriteBuffer& buffer, const SkCanvas::Lattice& lattice) { 83cb93a386Sopenharmony_ci const size_t size = WriteLattice(nullptr, lattice); 84cb93a386Sopenharmony_ci SkAutoSMalloc<1024> storage(size); 85cb93a386Sopenharmony_ci WriteLattice(storage.get(), lattice); 86cb93a386Sopenharmony_ci buffer.writePad32(storage.get(), size); 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_civoid SkCanvasPriv::GetDstClipAndMatrixCounts(const SkCanvas::ImageSetEntry set[], int count, 90cb93a386Sopenharmony_ci int* totalDstClipCount, int* totalMatrixCount) { 91cb93a386Sopenharmony_ci int dstClipCount = 0; 92cb93a386Sopenharmony_ci int maxMatrixIndex = -1; 93cb93a386Sopenharmony_ci for (int i = 0; i < count; ++i) { 94cb93a386Sopenharmony_ci dstClipCount += 4 * set[i].fHasClip; 95cb93a386Sopenharmony_ci if (set[i].fMatrixIndex > maxMatrixIndex) { 96cb93a386Sopenharmony_ci maxMatrixIndex = set[i].fMatrixIndex; 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci } 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci *totalDstClipCount = dstClipCount; 101cb93a386Sopenharmony_ci *totalMatrixCount = maxMatrixIndex + 1; 102cb93a386Sopenharmony_ci} 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_cibool SkCanvasPriv::ValidateMarker(const char* name) { 105cb93a386Sopenharmony_ci if (!name) { 106cb93a386Sopenharmony_ci return false; 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci std::locale loc(std::locale::classic()); 110cb93a386Sopenharmony_ci if (!std::isalpha(*name, loc)) { 111cb93a386Sopenharmony_ci return false; 112cb93a386Sopenharmony_ci } 113cb93a386Sopenharmony_ci while (*(++name)) { 114cb93a386Sopenharmony_ci if (!std::isalnum(*name, loc) && *name != '_') { 115cb93a386Sopenharmony_ci return false; 116cb93a386Sopenharmony_ci } 117cb93a386Sopenharmony_ci } 118cb93a386Sopenharmony_ci return true; 119cb93a386Sopenharmony_ci} 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci#if GR_TEST_UTILS 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 124cb93a386Sopenharmony_ci#include "src/gpu/BaseDevice.h" 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_ci#if SK_GPU_V1 127cb93a386Sopenharmony_ciskgpu::v1::SurfaceDrawContext* SkCanvasPriv::TopDeviceSurfaceDrawContext(SkCanvas* canvas) { 128cb93a386Sopenharmony_ci if (auto gpuDevice = canvas->topDevice()->asGpuDevice()) { 129cb93a386Sopenharmony_ci return gpuDevice->surfaceDrawContext(); 130cb93a386Sopenharmony_ci } 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci return nullptr; 133cb93a386Sopenharmony_ci} 134cb93a386Sopenharmony_ci#endif // SK_GPU_V1 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ciskgpu::SurfaceFillContext* SkCanvasPriv::TopDeviceSurfaceFillContext(SkCanvas* canvas) { 137cb93a386Sopenharmony_ci if (auto gpuDevice = canvas->topDevice()->asGpuDevice()) { 138cb93a386Sopenharmony_ci return gpuDevice->surfaceFillContext(); 139cb93a386Sopenharmony_ci } 140cb93a386Sopenharmony_ci 141cb93a386Sopenharmony_ci return nullptr; 142cb93a386Sopenharmony_ci} 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ci#else // SK_SUPPORT_GPU 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ci#if SK_GPU_V1 147cb93a386Sopenharmony_ciskgpu::v1::SurfaceDrawContext* SkCanvasPriv::TopDeviceSurfaceDrawContext(SkCanvas* canvas) { 148cb93a386Sopenharmony_ci return nullptr; 149cb93a386Sopenharmony_ci} 150cb93a386Sopenharmony_ci#endif // SK_GPU_V1 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_ciskgpu::SurfaceFillContext* SkCanvasPriv::TopDeviceSurfaceFillContext(SkCanvas* canvas) { 153cb93a386Sopenharmony_ci return nullptr; 154cb93a386Sopenharmony_ci} 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci#endif // SK_SUPPORT_GPU 157cb93a386Sopenharmony_ci 158cb93a386Sopenharmony_ci#endif // GR_TEST_UTILS 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 161cb93a386Sopenharmony_ci#include "src/gpu/BaseDevice.h" 162cb93a386Sopenharmony_ci 163cb93a386Sopenharmony_ciGrRenderTargetProxy* SkCanvasPriv::TopDeviceTargetProxy(SkCanvas* canvas) { 164cb93a386Sopenharmony_ci if (auto gpuDevice = canvas->topDevice()->asGpuDevice()) { 165cb93a386Sopenharmony_ci return gpuDevice->targetProxy(); 166cb93a386Sopenharmony_ci } 167cb93a386Sopenharmony_ci 168cb93a386Sopenharmony_ci return nullptr; 169cb93a386Sopenharmony_ci} 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ci#else // SK_SUPPORT_GPU 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_ciGrRenderTargetProxy* SkCanvasPriv::TopDeviceTargetProxy(SkCanvas* canvas) { 174cb93a386Sopenharmony_ci return nullptr; 175cb93a386Sopenharmony_ci} 176cb93a386Sopenharmony_ci 177cb93a386Sopenharmony_ci#endif // SK_SUPPORT_GPU 178