Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Side by Side Diff: src/gpu/text/GrAtlasTextBlob.h

Issue 1686113002: Remove GrTextBlobCache/GrAtlasTextBlob friendliness (Closed) Base URL: https://skia.googlesource.com/skia.git@tc-cleanup-1
Patch Set: build warnings Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/gpu/text/GrAtlasTextBlob.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrAtlasTextBlob_DEFINED 8 #ifndef GrAtlasTextBlob_DEFINED
9 #define GrAtlasTextBlob_DEFINED 9 #define GrAtlasTextBlob_DEFINED
10 10
11 #include "GrBatchAtlas.h" 11 #include "GrBatchAtlas.h"
12 #include "GrBatchFontCache.h" 12 #include "GrBatchFontCache.h"
13 #include "GrColor.h" 13 #include "GrColor.h"
14 #include "GrMemoryPool.h" 14 #include "GrMemoryPool.h"
15 #include "SkDescriptor.h" 15 #include "SkDescriptor.h"
16 #include "SkMaskFilter.h" 16 #include "SkMaskFilter.h"
17 #include "SkSurfaceProps.h" 17 #include "SkSurfaceProps.h"
18 #include "SkTInternalLList.h" 18 #include "SkTInternalLList.h"
19 19
20 struct GrDistanceFieldAdjustTable; 20 struct GrDistanceFieldAdjustTable;
21 class GrMemoryPool;
21 class GrTextContext; 22 class GrTextContext;
22 class SkDrawFilter; 23 class SkDrawFilter;
23 class SkTextBlob; 24 class SkTextBlob;
24 class SkTextBlobRunIterator; 25 class SkTextBlobRunIterator;
25 26
26 // With this flag enabled, the GrAtlasTextContext will, as a sanity check, regen erate every blob 27 // With this flag enabled, the GrAtlasTextContext will, as a sanity check, regen erate every blob
27 // that comes in to verify the integrity of its cache 28 // that comes in to verify the integrity of its cache
28 #define CACHE_SANITY_CHECK 0 29 #define CACHE_SANITY_CHECK 0
29 30
30 /* 31 /*
31 * A GrAtlasTextBlob contains a fully processed SkTextBlob, suitable for nearly immediate drawing 32 * A GrAtlasTextBlob contains a fully processed SkTextBlob, suitable for nearly immediate drawing
32 * on the GPU. These are initially created with valid positions and colors, but invalid 33 * on the GPU. These are initially created with valid positions and colors, but invalid
33 * texture coordinates. The GrAtlasTextBlob itself has a few Blob-wide properti es, and also 34 * texture coordinates. The GrAtlasTextBlob itself has a few Blob-wide properti es, and also
34 * consists of a number of runs. Runs inside a blob are flushed individually so they can be 35 * consists of a number of runs. Runs inside a blob are flushed individually so they can be
35 * reordered. 36 * reordered.
36 * 37 *
37 * The only thing(aside from a memcopy) required to flush a GrAtlasTextBlob is t o ensure that 38 * The only thing(aside from a memcopy) required to flush a GrAtlasTextBlob is t o ensure that
38 * the GrAtlas will not evict anything the Blob needs. 39 * the GrAtlas will not evict anything the Blob needs.
39 * 40 *
40 * Note: This struct should really be named GrCachedAtasTextBlob, but that is to o verbose. 41 * Note: This struct should really be named GrCachedAtasTextBlob, but that is to o verbose.
41 * 42 *
42 * *WARNING* If you add new fields to this struct, then you may need to to updat e AssertEqual 43 * *WARNING* If you add new fields to this struct, then you may need to to updat e AssertEqual
43 */ 44 */
44 class GrAtlasTextBlob : public SkNVRefCnt<GrAtlasTextBlob> { 45 class GrAtlasTextBlob : public SkNVRefCnt<GrAtlasTextBlob> {
45 public: 46 public:
46 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrAtlasTextBlob); 47 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrAtlasTextBlob);
47 48
48 GrAtlasTextBlob() 49 static GrAtlasTextBlob* Create(GrMemoryPool* pool, int glyphCount, int runCo unt);
49 : fMaxMinScale(-SK_ScalarMax)
50 , fMinMaxScale(SK_ScalarMax)
51 , fTextType(0) {}
52
53 ~GrAtlasTextBlob() {
54 for (int i = 0; i < fRunCount; i++) {
55 fRuns[i].~Run();
56 }
57 }
58 50
59 struct Key { 51 struct Key {
60 Key() { 52 Key() {
61 sk_bzero(this, sizeof(Key)); 53 sk_bzero(this, sizeof(Key));
62 } 54 }
63 uint32_t fUniqueID; 55 uint32_t fUniqueID;
64 // Color may affect the gamma of the mask we generate, but in a fairly l imited way. 56 // Color may affect the gamma of the mask we generate, but in a fairly l imited way.
65 // Each color is assigned to on of a fixed number of buckets based on it s 57 // Each color is assigned to on of a fixed number of buckets based on it s
66 // luminance. For each luminance bucket there is a "canonical color" tha t 58 // luminance. For each luminance bucket there is a "canonical color" tha t
67 // represents the bucket. This functionality is currently only supporte d for A8 59 // represents the bucket. This functionality is currently only supporte d for A8
68 SkColor fCanonicalColor; 60 SkColor fCanonicalColor;
69 SkPaint::Style fStyle; 61 SkPaint::Style fStyle;
70 SkPixelGeometry fPixelGeometry; 62 SkPixelGeometry fPixelGeometry;
71 bool fHasBlur; 63 bool fHasBlur;
72 64
73 bool operator==(const Key& other) const { 65 bool operator==(const Key& other) const {
74 return 0 == memcmp(this, &other, sizeof(Key)); 66 return 0 == memcmp(this, &other, sizeof(Key));
75 } 67 }
76 }; 68 };
77 69
70 void setupKey(const GrAtlasTextBlob::Key& key,
71 const SkMaskFilter::BlurRec& blurRec,
72 const SkPaint& paint) {
73 fKey = key;
74 if (key.fHasBlur) {
75 fBlurRec = blurRec;
76 }
77 if (key.fStyle != SkPaint::kFill_Style) {
78 fStrokeInfo.fFrameWidth = paint.getStrokeWidth();
79 fStrokeInfo.fMiterLimit = paint.getStrokeMiter();
80 fStrokeInfo.fJoin = paint.getStrokeJoin();
81 }
82 }
83
78 static const Key& GetKey(const GrAtlasTextBlob& blob) { 84 static const Key& GetKey(const GrAtlasTextBlob& blob) {
79 return blob.fKey; 85 return blob.fKey;
80 } 86 }
81 87
82 static uint32_t Hash(const Key& key) { 88 static uint32_t Hash(const Key& key) {
83 return SkChecksum::Murmur3(&key, sizeof(Key)); 89 return SkChecksum::Murmur3(&key, sizeof(Key));
84 } 90 }
85 91
86 void operator delete(void* p) { 92 void operator delete(void* p) {
87 GrAtlasTextBlob* blob = reinterpret_cast<GrAtlasTextBlob*>(p); 93 GrAtlasTextBlob* blob = reinterpret_cast<GrAtlasTextBlob*>(p);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 const GrDistanceFieldAdjustTable* distanceAdjustTable, 197 const GrDistanceFieldAdjustTable* distanceAdjustTable,
192 const SkPaint& skPaint, 198 const SkPaint& skPaint,
193 const GrPaint& grPaint, 199 const GrPaint& grPaint,
194 const GrClip& clip, 200 const GrClip& clip,
195 const SkIRect& clipBounds); 201 const SkIRect& clipBounds);
196 202
197 // position + local coord 203 // position + local coord
198 static const size_t kColorTextVASize = sizeof(SkPoint) + sizeof(SkIPoint16); 204 static const size_t kColorTextVASize = sizeof(SkPoint) + sizeof(SkIPoint16);
199 static const size_t kGrayTextVASize = sizeof(SkPoint) + sizeof(GrColor) + si zeof(SkIPoint16); 205 static const size_t kGrayTextVASize = sizeof(SkPoint) + sizeof(GrColor) + si zeof(SkIPoint16);
200 static const size_t kLCDTextVASize = kGrayTextVASize; 206 static const size_t kLCDTextVASize = kGrayTextVASize;
207 static const size_t kMaxVASize = kGrayTextVASize;
201 static const int kVerticesPerGlyph = 4; 208 static const int kVerticesPerGlyph = 4;
202 209
203 static void AssertEqual(const GrAtlasTextBlob&, const GrAtlasTextBlob&); 210 static void AssertEqual(const GrAtlasTextBlob&, const GrAtlasTextBlob&);
204 211
205 // The color here is the GrPaint color, and it is used to determine whether we 212 // The color here is the GrPaint color, and it is used to determine whether we
206 // have to regenerate LCD text blobs. 213 // have to regenerate LCD text blobs.
207 // We use this color vs the SkPaint color because it has the colorfilter app lied. 214 // We use this color vs the SkPaint color because it has the colorfilter app lied.
208 void initReusableBlob(GrColor color, const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { 215 void initReusableBlob(GrColor color, const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
209 fPaintColor = color; 216 fPaintColor = color;
210 this->setupViewMatrix(viewMatrix, x, y); 217 this->setupViewMatrix(viewMatrix, x, y);
211 } 218 }
212 219
213 void initThrowawayBlob(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { 220 void initThrowawayBlob(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
214 this->setupViewMatrix(viewMatrix, x, y); 221 this->setupViewMatrix(viewMatrix, x, y);
215 } 222 }
216 223
217 GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun, 224 GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun,
218 GrColor color, SkScalar transX, SkScalar trans Y, 225 GrColor color, SkScalar transX, SkScalar trans Y,
219 const SkPaint& skPaint, const SkSurfaceProps& props, 226 const SkPaint& skPaint, const SkSurfaceProps& props,
220 const GrDistanceFieldAdjustTable* distanceAdju stTable, 227 const GrDistanceFieldAdjustTable* distanceAdju stTable,
221 GrBatchFontCache* cache); 228 GrBatchFontCache* cache);
222 229
230 const Key& key() const { return fKey; }
231
232 ~GrAtlasTextBlob() {
233 for (int i = 0; i < fRunCount; i++) {
234 fRuns[i].~Run();
235 }
236 }
237
223 private: 238 private:
239 GrAtlasTextBlob()
240 : fMaxMinScale(-SK_ScalarMax)
241 , fMinMaxScale(SK_ScalarMax)
242 , fTextType(0) {}
243
224 void appendLargeGlyph(GrGlyph* glyph, GrFontScaler* scaler, const SkGlyph& s kGlyph, 244 void appendLargeGlyph(GrGlyph* glyph, GrFontScaler* scaler, const SkGlyph& s kGlyph,
225 SkScalar x, SkScalar y, SkScalar scale, bool applyVM); 245 SkScalar x, SkScalar y, SkScalar scale, bool applyVM);
226 246
227 inline void flushRun(GrDrawContext* dc, GrPipelineBuilder* pipelineBuilder, 247 inline void flushRun(GrDrawContext* dc, GrPipelineBuilder* pipelineBuilder,
228 int run, GrColor color, 248 int run, GrColor color,
229 SkScalar transX, SkScalar transY, 249 SkScalar transX, SkScalar transY,
230 const SkPaint& skPaint, const SkSurfaceProps& props, 250 const SkPaint& skPaint, const SkSurfaceProps& props,
231 const GrDistanceFieldAdjustTable* distanceAdjustTable, 251 const GrDistanceFieldAdjustTable* distanceAdjustTable,
232 GrBatchFontCache* cache); 252 GrBatchFontCache* cache);
233 253
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 469
450 // We can reuse distance field text, but only if the new viewmatrix would no t result in 470 // We can reuse distance field text, but only if the new viewmatrix would no t result in
451 // a mip change. Because there can be multiple runs in a blob, we track the overall 471 // a mip change. Because there can be multiple runs in a blob, we track the overall
452 // maximum minimum scale, and minimum maximum scale, we can support before w e need to regen 472 // maximum minimum scale, and minimum maximum scale, we can support before w e need to regen
453 SkScalar fMaxMinScale; 473 SkScalar fMaxMinScale;
454 SkScalar fMinMaxScale; 474 SkScalar fMinMaxScale;
455 int fRunCount; 475 int fRunCount;
456 uint8_t fTextType; 476 uint8_t fTextType;
457 477
458 friend class GrAtlasTextBatch; // We might be able to get rid of this friend ing 478 friend class GrAtlasTextBatch; // We might be able to get rid of this friend ing
459 friend class GrTextBlobCache; // Needs to access the key
460 }; 479 };
461 480
462 #endif 481 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/text/GrAtlasTextBlob.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698