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