1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 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 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef sktext_gpu_TextBlob_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define sktext_gpu_TextBlob_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTInternalLList.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMaskFilterBase.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunAllocator.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunContainer.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 24*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 25*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 28*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint; 29*c8dee2aaSAndroid Build Coastguard Worker struct SkStrikeDeviceInfo; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 32*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList; 33*c8dee2aaSAndroid Build Coastguard Worker class StrikeForGPUCacheInterface; 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu { 37*c8dee2aaSAndroid Build Coastguard Worker class Slug; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker // -- TextBlob ----------------------------------------------------------------------------------- 40*c8dee2aaSAndroid Build Coastguard Worker // A TextBlob contains a fully processed SkTextBlob, suitable for nearly immediate drawing 41*c8dee2aaSAndroid Build Coastguard Worker // on the GPU. These are initially created with valid positions and colors, but with invalid 42*c8dee2aaSAndroid Build Coastguard Worker // texture coordinates. 43*c8dee2aaSAndroid Build Coastguard Worker // 44*c8dee2aaSAndroid Build Coastguard Worker // A TextBlob contains a number of SubRuns that are created in the blob's arena. Each SubRun 45*c8dee2aaSAndroid Build Coastguard Worker // tracks its own glyph and position data. 46*c8dee2aaSAndroid Build Coastguard Worker // 47*c8dee2aaSAndroid Build Coastguard Worker // In these classes, I'm trying to follow the convention about matrices and origins. 48*c8dee2aaSAndroid Build Coastguard Worker // * drawMatrix and drawOrigin - describes transformations for the current draw command. 49*c8dee2aaSAndroid Build Coastguard Worker // * positionMatrix - is equal to drawMatrix * [drawOrigin-as-translation-matrix] 50*c8dee2aaSAndroid Build Coastguard Worker // * initial Matrix - describes the combined initial matrix and origin the TextBlob was created 51*c8dee2aaSAndroid Build Coastguard Worker // with. 52*c8dee2aaSAndroid Build Coastguard Worker // 53*c8dee2aaSAndroid Build Coastguard Worker // 54*c8dee2aaSAndroid Build Coastguard Worker class TextBlob final : public SkRefCnt { 55*c8dee2aaSAndroid Build Coastguard Worker public: 56*c8dee2aaSAndroid Build Coastguard Worker // Key is not used as part of a hash map, so the hash is never taken. It's only used in a 57*c8dee2aaSAndroid Build Coastguard Worker // list search using operator =(). 58*c8dee2aaSAndroid Build Coastguard Worker struct Key { 59*c8dee2aaSAndroid Build Coastguard Worker static std::tuple<bool, Key> Make(const GlyphRunList& glyphRunList, 60*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint, 61*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& drawMatrix, 62*c8dee2aaSAndroid Build Coastguard Worker const SkStrikeDeviceInfo& strikeDevice); 63*c8dee2aaSAndroid Build Coastguard Worker uint32_t fUniqueID; 64*c8dee2aaSAndroid Build Coastguard Worker // Color may affect the gamma of the mask we generate, but in a fairly limited way. 65*c8dee2aaSAndroid Build Coastguard Worker // Each color is assigned to on of a fixed number of buckets based on its 66*c8dee2aaSAndroid Build Coastguard Worker // luminance. For each luminance bucket there is a "canonical color" that 67*c8dee2aaSAndroid Build Coastguard Worker // represents the bucket. This functionality is currently only supported for A8 68*c8dee2aaSAndroid Build Coastguard Worker SkColor fCanonicalColor; 69*c8dee2aaSAndroid Build Coastguard Worker SkScalar fFrameWidth; 70*c8dee2aaSAndroid Build Coastguard Worker SkScalar fMiterLimit; 71*c8dee2aaSAndroid Build Coastguard Worker SkPixelGeometry fPixelGeometry; 72*c8dee2aaSAndroid Build Coastguard Worker SkMaskFilterBase::BlurRec fBlurRec; 73*c8dee2aaSAndroid Build Coastguard Worker uint32_t fScalerContextFlags; 74*c8dee2aaSAndroid Build Coastguard Worker SkMatrix fPositionMatrix; 75*c8dee2aaSAndroid Build Coastguard Worker // Below here fields are of size 1 byte. 76*c8dee2aaSAndroid Build Coastguard Worker bool fHasSomeDirectSubRuns; 77*c8dee2aaSAndroid Build Coastguard Worker bool fHasBlur; 78*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 79*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const Key& other) const; 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker SK_DECLARE_INTERNAL_LLIST_INTERFACE(TextBlob); 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker // Make a TextBlob and its sub runs. 87*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<TextBlob> Make(const sktext::GlyphRunList& glyphRunList, 88*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint, 89*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& positionMatrix, 90*c8dee2aaSAndroid Build Coastguard Worker SkStrikeDeviceInfo strikeDeviceInfo, 91*c8dee2aaSAndroid Build Coastguard Worker StrikeForGPUCacheInterface* strikeCache); 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker TextBlob(SubRunAllocator&& alloc, 94*c8dee2aaSAndroid Build Coastguard Worker SubRunContainerOwner subRuns, 95*c8dee2aaSAndroid Build Coastguard Worker int totalMemorySize, 96*c8dee2aaSAndroid Build Coastguard Worker SkColor initialLuminance); 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker ~TextBlob() override; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker // Change memory management to handle the data after TextBlob, but in the same allocation 101*c8dee2aaSAndroid Build Coastguard Worker // of memory. Only allow placement new. 102*c8dee2aaSAndroid Build Coastguard Worker void operator delete(void* p); 103*c8dee2aaSAndroid Build Coastguard Worker void* operator new(size_t); 104*c8dee2aaSAndroid Build Coastguard Worker void* operator new(size_t, void* p); 105*c8dee2aaSAndroid Build Coastguard Worker key()106*c8dee2aaSAndroid Build Coastguard Worker const Key& key() { return fKey; } 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker void addKey(const Key& key); 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker bool canReuse(const SkPaint& paint, const SkMatrix& positionMatrix) const; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker const Key& key() const; size()113*c8dee2aaSAndroid Build Coastguard Worker size_t size() const { return SkTo<size_t>(fSize); } 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas*, 116*c8dee2aaSAndroid Build Coastguard Worker SkPoint drawOrigin, 117*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint, 118*c8dee2aaSAndroid Build Coastguard Worker const AtlasDrawDelegate&); 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker private: 121*c8dee2aaSAndroid Build Coastguard Worker friend class TextBlobTools; 122*c8dee2aaSAndroid Build Coastguard Worker // The allocator must come first because it needs to be destroyed last. Other fields of this 123*c8dee2aaSAndroid Build Coastguard Worker // structure may have pointers into it. 124*c8dee2aaSAndroid Build Coastguard Worker SubRunAllocator fAlloc; 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker SubRunContainerOwner fSubRuns; 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker // Overall size of this struct plus vertices and glyphs at the end. 129*c8dee2aaSAndroid Build Coastguard Worker const int fSize; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker const SkColor fInitialLuminance; 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker Key fKey; 134*c8dee2aaSAndroid Build Coastguard Worker }; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sktext::gpu::Slug> MakeSlug(const SkMatrix& drawMatrix, 137*c8dee2aaSAndroid Build Coastguard Worker const sktext::GlyphRunList& glyphRunList, 138*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint, 139*c8dee2aaSAndroid Build Coastguard Worker SkStrikeDeviceInfo strikeDeviceInfo, 140*c8dee2aaSAndroid Build Coastguard Worker sktext::StrikeForGPUCacheInterface* strikeCache); 141*c8dee2aaSAndroid Build Coastguard Worker } // namespace sktext::gpu 142*c8dee2aaSAndroid Build Coastguard Worker #endif // sktext_gpu_TextBlob_DEFINED 143