1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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 #ifndef SmallPathShapeData_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SmallPathShapeData_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE) 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTInternalLList.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 21*c8dee2aaSAndroid Build Coastguard Worker #include <cstring> 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape; 24*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker class SmallPathShapeDataKey { 29*c8dee2aaSAndroid Build Coastguard Worker public: 30*c8dee2aaSAndroid Build Coastguard Worker // TODO: add a move variant SmallPathShapeDataKey(const SmallPathShapeDataKey & that)31*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeDataKey(const SmallPathShapeDataKey& that) { 32*c8dee2aaSAndroid Build Coastguard Worker fKey.reset(that.fKey.count()); 33*c8dee2aaSAndroid Build Coastguard Worker memcpy(fKey.get(), that.fKey.get(), fKey.count() * sizeof(uint32_t)); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeDataKey& operator=(const SmallPathShapeDataKey&) = delete; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker // for SDF paths 39*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeDataKey(const GrStyledShape&, uint32_t dim); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker // for bitmap paths 42*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeDataKey(const GrStyledShape&, const SkMatrix& ctm); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const SmallPathShapeDataKey & that) const { 45*c8dee2aaSAndroid Build Coastguard Worker return fKey.count() == that.fKey.count() && 46*c8dee2aaSAndroid Build Coastguard Worker 0 == memcmp(fKey.get(), that.fKey.get(), sizeof(uint32_t) * fKey.count()); 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker count32()49*c8dee2aaSAndroid Build Coastguard Worker int count32() const { return fKey.count(); } data()50*c8dee2aaSAndroid Build Coastguard Worker const uint32_t* data() const { return fKey.get(); } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker private: 53*c8dee2aaSAndroid Build Coastguard Worker // The key is composed of the GrStyledShape's key, and either the dimensions of the DF 54*c8dee2aaSAndroid Build Coastguard Worker // generated for the path (32x32 max, 64x64 max, 128x128 max) if an SDF image or 55*c8dee2aaSAndroid Build Coastguard Worker // the matrix for the path with only fractional translation. 56*c8dee2aaSAndroid Build Coastguard Worker skia_private::AutoSTArray<24, uint32_t> fKey; 57*c8dee2aaSAndroid Build Coastguard Worker }; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker class SmallPathShapeData { 60*c8dee2aaSAndroid Build Coastguard Worker public: SmallPathShapeData(const SmallPathShapeDataKey & key)61*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeData(const SmallPathShapeDataKey& key) : fKey(key) {} 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker const SmallPathShapeDataKey fKey; 64*c8dee2aaSAndroid Build Coastguard Worker SkRect fBounds; 65*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasLocator fAtlasLocator; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker SK_DECLARE_INTERNAL_LLIST_INTERFACE(SmallPathShapeData); 68*c8dee2aaSAndroid Build Coastguard Worker GetKey(const SmallPathShapeData & data)69*c8dee2aaSAndroid Build Coastguard Worker static inline const SmallPathShapeDataKey& GetKey(const SmallPathShapeData& data) { 70*c8dee2aaSAndroid Build Coastguard Worker return data.fKey; 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker Hash(const SmallPathShapeDataKey & key)73*c8dee2aaSAndroid Build Coastguard Worker static inline uint32_t Hash(const SmallPathShapeDataKey& key) { 74*c8dee2aaSAndroid Build Coastguard Worker return SkChecksum::Hash32(key.data(), sizeof(uint32_t) * key.count32()); 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_ENABLE_OPTIMIZE_SIZE 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker #endif // SmallPathShapeData_DEFINED 83