xref: /aosp_15_r20/external/skia/src/text/gpu/SlugImpl.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2023 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #ifndef sktext_SlugImpl_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define sktext_SlugImpl_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/chromium/Slug.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunAllocator.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunContainer.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix;
21*c8dee2aaSAndroid Build Coastguard Worker class SkPaint;
22*c8dee2aaSAndroid Build Coastguard Worker class SkReadBuffer;
23*c8dee2aaSAndroid Build Coastguard Worker class SkStrikeClient;
24*c8dee2aaSAndroid Build Coastguard Worker class SkWriteBuffer;
25*c8dee2aaSAndroid Build Coastguard Worker struct SkStrikeDeviceInfo;
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker namespace sktext {
28*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList;
29*c8dee2aaSAndroid Build Coastguard Worker class StrikeForGPUCacheInterface;
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu {
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker class SlugImpl final : public Slug {
35*c8dee2aaSAndroid Build Coastguard Worker public:
36*c8dee2aaSAndroid Build Coastguard Worker     SlugImpl(SubRunAllocator&& alloc,
37*c8dee2aaSAndroid Build Coastguard Worker              gpu::SubRunContainerOwner subRuns,
38*c8dee2aaSAndroid Build Coastguard Worker              SkRect sourceBounds,
39*c8dee2aaSAndroid Build Coastguard Worker              SkPoint origin);
40*c8dee2aaSAndroid Build Coastguard Worker     ~SlugImpl() override = default;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SlugImpl> Make(const SkMatrix& viewMatrix,
43*c8dee2aaSAndroid Build Coastguard Worker                                 const sktext::GlyphRunList& glyphRunList,
44*c8dee2aaSAndroid Build Coastguard Worker                                 const SkPaint& paint,
45*c8dee2aaSAndroid Build Coastguard Worker                                 SkStrikeDeviceInfo strikeDeviceInfo,
46*c8dee2aaSAndroid Build Coastguard Worker                                 sktext::StrikeForGPUCacheInterface* strikeCache);
47*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Slug> MakeFromBuffer(SkReadBuffer& buffer,
48*c8dee2aaSAndroid Build Coastguard Worker                                       const SkStrikeClient* client);
49*c8dee2aaSAndroid Build Coastguard Worker     void doFlatten(SkWriteBuffer& buffer) const override;
50*c8dee2aaSAndroid Build Coastguard Worker 
sourceBounds()51*c8dee2aaSAndroid Build Coastguard Worker     SkRect sourceBounds() const override { return fSourceBounds; }
sourceBoundsWithOrigin()52*c8dee2aaSAndroid Build Coastguard Worker     SkRect sourceBoundsWithOrigin() const override { return fSourceBounds.makeOffset(fOrigin); }
53*c8dee2aaSAndroid Build Coastguard Worker 
initialPositionMatrix()54*c8dee2aaSAndroid Build Coastguard Worker     const SkMatrix& initialPositionMatrix() const { return fSubRuns->initialPosition(); }
origin()55*c8dee2aaSAndroid Build Coastguard Worker     SkPoint origin() const { return fOrigin; }
56*c8dee2aaSAndroid Build Coastguard Worker 
subRuns()57*c8dee2aaSAndroid Build Coastguard Worker     const gpu::SubRunContainerOwner& subRuns() const { return fSubRuns; }
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker     // Change memory management to handle the data after Slug, but in the same allocation
60*c8dee2aaSAndroid Build Coastguard Worker     // of memory. Only allow placement new.
delete(void * p)61*c8dee2aaSAndroid Build Coastguard Worker     void operator delete(void* p) { ::operator delete(p); }
new(size_t)62*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t) { SK_ABORT("All slugs are created by placement new."); }
new(size_t,void * p)63*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t, void* p) { return p; }
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker private:
66*c8dee2aaSAndroid Build Coastguard Worker     // The allocator must come first because it needs to be destroyed last. Other fields of this
67*c8dee2aaSAndroid Build Coastguard Worker     // structure may have pointers into it.
68*c8dee2aaSAndroid Build Coastguard Worker     SubRunAllocator fAlloc;
69*c8dee2aaSAndroid Build Coastguard Worker     gpu::SubRunContainerOwner fSubRuns;
70*c8dee2aaSAndroid Build Coastguard Worker     const SkRect fSourceBounds;
71*c8dee2aaSAndroid Build Coastguard Worker     const SkPoint fOrigin;
72*c8dee2aaSAndroid Build Coastguard Worker };
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker }  // namespace sktext::gpu
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker #endif
77