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

Side by Side Diff: src/fonts/SkRandomScalerContext.cpp

Issue 1260473004: Adding debug SkScalerContext which returns random mask formats (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: more twiddling Created 5 years, 4 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 | « src/fonts/SkRandomScalerContext.h ('k') | no next file » | 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 2013 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 #include "SkGScalerContext.h" 8 #include "SkRandomScalerContext.h"
9 #include "SkGlyph.h" 9 #include "SkGlyph.h"
10 #include "SkPath.h" 10 #include "SkPath.h"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 12
13 class SkGScalerContext : public SkScalerContext { 13 class SkRandomScalerContext : public SkScalerContext {
14 public: 14 public:
15 SkGScalerContext(SkGTypeface*, const SkDescriptor*); 15 SkRandomScalerContext(SkRandomTypeface*, const SkDescriptor*);
16 virtual ~SkGScalerContext(); 16 virtual ~SkRandomScalerContext();
17 17
18 protected: 18 protected:
19 unsigned generateGlyphCount() override; 19 unsigned generateGlyphCount() override;
20 uint16_t generateCharToGlyph(SkUnichar) override; 20 uint16_t generateCharToGlyph(SkUnichar) override;
21 void generateAdvance(SkGlyph*) override; 21 void generateAdvance(SkGlyph*) override;
22 void generateMetrics(SkGlyph*) override; 22 void generateMetrics(SkGlyph*) override;
23 void generateImage(const SkGlyph&) override; 23 void generateImage(const SkGlyph&) override;
24 void generatePath(const SkGlyph&, SkPath*) override; 24 void generatePath(const SkGlyph&, SkPath*) override;
25 void generateFontMetrics(SkPaint::FontMetrics*) override; 25 void generateFontMetrics(SkPaint::FontMetrics*) override;
26 26
27 private: 27 private:
28 SkGTypeface* fFace; 28 SkRandomTypeface* fFace;
29 SkScalerContext* fProxy; 29 SkScalerContext* fProxy;
30 SkMatrix fMatrix; 30 SkMatrix fMatrix;
31 }; 31 };
32 32
33 #define STD_SIZE 1 33 #define STD_SIZE 1
34 34
35 #include "SkDescriptor.h" 35 #include "SkDescriptor.h"
36 36
37 SkGScalerContext::SkGScalerContext(SkGTypeface* face, const SkDescriptor* desc) 37 SkRandomScalerContext::SkRandomScalerContext(SkRandomTypeface* face, const SkDes criptor* desc)
38 : SkScalerContext(face, desc) 38 : SkScalerContext(face, desc)
39 , fFace(face) 39 , fFace(face) {
40 {
41
42 size_t descSize = SkDescriptor::ComputeOverhead(1) + sizeof(SkScalerContext ::Rec); 40 size_t descSize = SkDescriptor::ComputeOverhead(1) + sizeof(SkScalerContext ::Rec);
43 SkAutoDescriptor ad(descSize); 41 SkAutoDescriptor ad(descSize);
44 SkDescriptor* newDesc = ad.getDesc(); 42 SkDescriptor* newDesc = ad.getDesc();
45 43
46 newDesc->init(); 44 newDesc->init();
47 void* entry = newDesc->addEntry(kRec_SkDescriptorTag, 45 void* entry = newDesc->addEntry(kRec_SkDescriptorTag,
48 sizeof(SkScalerContext::Rec), &fRec); 46 sizeof(SkScalerContext::Rec), &fRec);
49 { 47 {
50 SkScalerContext::Rec* rec = (SkScalerContext::Rec*)entry; 48 SkScalerContext::Rec* rec = (SkScalerContext::Rec*)entry;
51 rec->fTextSize = STD_SIZE; 49 rec->fTextSize = STD_SIZE;
52 rec->fPreScaleX = SK_Scalar1; 50 rec->fPreScaleX = SK_Scalar1;
53 rec->fPreSkewX = 0; 51 rec->fPreSkewX = 0;
54 rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1; 52 rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1;
55 rec->fPost2x2[1][0] = rec->fPost2x2[0][1] = 0; 53 rec->fPost2x2[1][0] = rec->fPost2x2[0][1] = 0;
56 } 54 }
57 SkASSERT(descSize == newDesc->getLength()); 55 SkASSERT(descSize == newDesc->getLength());
58 newDesc->computeChecksum(); 56 newDesc->computeChecksum();
59 57
60 fProxy = face->proxy()->createScalerContext(newDesc); 58 fProxy = face->proxy()->createScalerContext(newDesc);
61 59
62 fRec.getSingleMatrix(&fMatrix); 60 fRec.getSingleMatrix(&fMatrix);
63 fMatrix.preScale(SK_Scalar1 / STD_SIZE, SK_Scalar1 / STD_SIZE); 61 fMatrix.preScale(SK_Scalar1 / STD_SIZE, SK_Scalar1 / STD_SIZE);
64 } 62 }
65 63
66 SkGScalerContext::~SkGScalerContext() { 64 SkRandomScalerContext::~SkRandomScalerContext() {
67 SkDELETE(fProxy); 65 SkDELETE(fProxy);
68 } 66 }
69 67
70 unsigned SkGScalerContext::generateGlyphCount() { 68 unsigned SkRandomScalerContext::generateGlyphCount() {
71 return fProxy->getGlyphCount(); 69 return fProxy->getGlyphCount();
72 } 70 }
73 71
74 uint16_t SkGScalerContext::generateCharToGlyph(SkUnichar uni) { 72 uint16_t SkRandomScalerContext::generateCharToGlyph(SkUnichar uni) {
75 return fProxy->charToGlyphID(uni); 73 return fProxy->charToGlyphID(uni);
76 } 74 }
77 75
78 void SkGScalerContext::generateAdvance(SkGlyph* glyph) { 76 void SkRandomScalerContext::generateAdvance(SkGlyph* glyph) {
79 fProxy->getAdvance(glyph); 77 fProxy->getAdvance(glyph);
80 78
81 SkVector advance; 79 SkVector advance;
82 fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX), 80 fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX),
83 SkFixedToScalar(glyph->fAdvanceY), &advance); 81 SkFixedToScalar(glyph->fAdvanceY), &advance);
84 glyph->fAdvanceX = SkScalarToFixed(advance.fX); 82 glyph->fAdvanceX = SkScalarToFixed(advance.fX);
85 glyph->fAdvanceY = SkScalarToFixed(advance.fY); 83 glyph->fAdvanceY = SkScalarToFixed(advance.fY);
86 } 84 }
87 85
88 void SkGScalerContext::generateMetrics(SkGlyph* glyph) { 86 void SkRandomScalerContext::generateMetrics(SkGlyph* glyph) {
89 fProxy->getMetrics(glyph); 87 fProxy->getAdvance(glyph);
90 88
91 SkVector advance; 89 SkVector advance;
92 fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX), 90 fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX),
93 SkFixedToScalar(glyph->fAdvanceY), &advance); 91 SkFixedToScalar(glyph->fAdvanceY), &advance);
94 glyph->fAdvanceX = SkScalarToFixed(advance.fX); 92 glyph->fAdvanceX = SkScalarToFixed(advance.fX);
95 glyph->fAdvanceY = SkScalarToFixed(advance.fY); 93 glyph->fAdvanceY = SkScalarToFixed(advance.fY);
96 94
97 SkPath path; 95 SkPath path;
98 fProxy->getPath(*glyph, &path); 96 fProxy->getPath(*glyph, &path);
99 path.transform(fMatrix); 97 path.transform(fMatrix);
100 98
101 SkRect storage; 99 SkRect storage;
102 const SkPaint& paint = fFace->paint(); 100 const SkPaint& paint = fFace->paint();
103 const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(), 101 const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(),
104 &storage, 102 &storage,
105 SkPaint::kFill_Style); 103 SkPaint::kFill_Style);
106 SkIRect ibounds; 104 SkIRect ibounds;
107 newBounds.roundOut(&ibounds); 105 newBounds.roundOut(&ibounds);
108 glyph->fLeft = ibounds.fLeft; 106 glyph->fLeft = ibounds.fLeft;
109 glyph->fTop = ibounds.fTop; 107 glyph->fTop = ibounds.fTop;
110 glyph->fWidth = ibounds.width(); 108 glyph->fWidth = ibounds.width();
111 glyph->fHeight = ibounds.height(); 109 glyph->fHeight = ibounds.height();
112 glyph->fMaskFormat = SkMask::kARGB32_Format; 110
111 // Here we will change the mask format of the glyph
112 // NOTE this is being overridden by the base class
113 SkMask::Format format;
114 switch (glyph->getGlyphID() % 6) {
115 case 0:
116 format = SkMask::kLCD16_Format;
117 break;
118 case 1:
119 format = SkMask::kA8_Format;
120 break;
121 case 2:
122 format = SkMask::kARGB32_Format;
123 break;
124 default:
125 // we will fiddle with these in generate image
126 format = (SkMask::Format)MASK_FORMAT_UNKNOWN;
127 }
128
129 glyph->fMaskFormat = format;
113 } 130 }
114 131
115 void SkGScalerContext::generateImage(const SkGlyph& glyph) { 132 void SkRandomScalerContext::generateImage(const SkGlyph& glyph) {
133 SkMask::Format format = (SkMask::Format)glyph.fMaskFormat;
134 switch (glyph.getGlyphID() % 6) {
135 case 0:
136 case 1:
137 case 2:
138 break;
139 case 3:
140 format = SkMask::kLCD16_Format;
141 break;
142 case 4:
143 format = SkMask::kA8_Format;
144 break;
145 case 5:
146 format = SkMask::kARGB32_Format;
147 break;
148 }
149 const_cast<SkGlyph&>(glyph).fMaskFormat = format;
150
151 // if the format is ARGB, we just draw the glyph from path ourselves. Other wise, we force
152 // our proxy context to generate the image from paths.
116 if (SkMask::kARGB32_Format == glyph.fMaskFormat) { 153 if (SkMask::kARGB32_Format == glyph.fMaskFormat) {
117 SkPath path; 154 SkPath path;
118 fProxy->getPath(glyph, &path); 155 fProxy->getPath(glyph, &path);
119 156
120 SkBitmap bm; 157 SkBitmap bm;
121 bm.installPixels(SkImageInfo::MakeN32Premul(glyph.fWidth, glyph.fHeight) , 158 bm.installPixels(SkImageInfo::MakeN32Premul(glyph.fWidth, glyph.fHeight) ,
122 glyph.fImage, glyph.rowBytes()); 159 glyph.fImage, glyph.rowBytes());
123 bm.eraseColor(0); 160 bm.eraseColor(0);
124 161
125 SkCanvas canvas(bm); 162 SkCanvas canvas(bm);
126 canvas.translate(-SkIntToScalar(glyph.fLeft), 163 canvas.translate(-SkIntToScalar(glyph.fLeft),
127 -SkIntToScalar(glyph.fTop)); 164 -SkIntToScalar(glyph.fTop));
128 canvas.concat(fMatrix); 165 canvas.concat(fMatrix);
129 canvas.drawPath(path, fFace->paint()); 166 canvas.drawPath(path, fFace->paint());
130 } else { 167 } else {
168 this->forceGenerateImageFromPath();
131 fProxy->getImage(glyph); 169 fProxy->getImage(glyph);
170 this->forceOffGenerateImageFromPath();
132 } 171 }
133 } 172 }
134 173
135 void SkGScalerContext::generatePath(const SkGlyph& glyph, SkPath* path) { 174 void SkRandomScalerContext::generatePath(const SkGlyph& glyph, SkPath* path) {
136 fProxy->getPath(glyph, path); 175 fProxy->getPath(glyph, path);
137 path->transform(fMatrix); 176 path->transform(fMatrix);
138 } 177 }
139 178
140 void SkGScalerContext::generateFontMetrics(SkPaint::FontMetrics* metrics) { 179 void SkRandomScalerContext::generateFontMetrics(SkPaint::FontMetrics* metrics) {
141 fProxy->getFontMetrics(metrics); 180 fProxy->getFontMetrics(metrics);
142 if (metrics) { 181 if (metrics) {
143 SkScalar scale = fMatrix.getScaleY(); 182 SkScalar scale = fMatrix.getScaleY();
144 metrics->fTop = SkScalarMul(metrics->fTop, scale); 183 metrics->fTop = SkScalarMul(metrics->fTop, scale);
145 metrics->fAscent = SkScalarMul(metrics->fAscent, scale); 184 metrics->fAscent = SkScalarMul(metrics->fAscent, scale);
146 metrics->fDescent = SkScalarMul(metrics->fDescent, scale); 185 metrics->fDescent = SkScalarMul(metrics->fDescent, scale);
147 metrics->fBottom = SkScalarMul(metrics->fBottom, scale); 186 metrics->fBottom = SkScalarMul(metrics->fBottom, scale);
148 metrics->fLeading = SkScalarMul(metrics->fLeading, scale); 187 metrics->fLeading = SkScalarMul(metrics->fLeading, scale);
149 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale); 188 metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale);
150 metrics->fXMin = SkScalarMul(metrics->fXMin, scale); 189 metrics->fXMin = SkScalarMul(metrics->fXMin, scale);
151 metrics->fXMax = SkScalarMul(metrics->fXMax, scale); 190 metrics->fXMax = SkScalarMul(metrics->fXMax, scale);
152 metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale); 191 metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale);
153 } 192 }
154 } 193 }
155 194
156 /////////////////////////////////////////////////////////////////////////////// 195 ///////////////////////////////////////////////////////////////////////////////
157 196
158 #include "SkTypefaceCache.h" 197 #include "SkTypefaceCache.h"
159 198
160 SkGTypeface::SkGTypeface(SkTypeface* proxy, const SkPaint& paint) 199 SkRandomTypeface::SkRandomTypeface(SkTypeface* proxy, const SkPaint& paint)
161 : SkTypeface(proxy->fontStyle(), SkTypefaceCache::NewFontID(), false) 200 : SkTypeface(proxy->fontStyle(), SkTypefaceCache::NewFontID(), false)
162 , fProxy(SkRef(proxy)) 201 , fProxy(SkRef(proxy))
163 , fPaint(paint) {} 202 , fPaint(paint) {}
164 203
165 SkGTypeface::~SkGTypeface() { 204 SkRandomTypeface::~SkRandomTypeface() {
166 fProxy->unref(); 205 fProxy->unref();
167 } 206 }
168 207
169 SkScalerContext* SkGTypeface::onCreateScalerContext( 208 SkScalerContext* SkRandomTypeface::onCreateScalerContext(
170 const SkDescriptor* desc) const { 209 const SkDescriptor* desc) const {
171 return SkNEW_ARGS(SkGScalerContext, (const_cast<SkGTypeface*>(this), desc)); 210 return SkNEW_ARGS(SkRandomScalerContext, (const_cast<SkRandomTypeface*>(this ), desc));
172 } 211 }
173 212
174 void SkGTypeface::onFilterRec(SkScalerContextRec* rec) const { 213 void SkRandomTypeface::onFilterRec(SkScalerContextRec* rec) const {
175 fProxy->filterRec(rec); 214 fProxy->filterRec(rec);
176 rec->setHinting(SkPaint::kNo_Hinting); 215 rec->setHinting(SkPaint::kNo_Hinting);
177 rec->fMaskFormat = SkMask::kARGB32_Format; 216 rec->fMaskFormat = SkMask::kARGB32_Format;
178 } 217 }
179 218
180 SkAdvancedTypefaceMetrics* SkGTypeface::onGetAdvancedTypefaceMetrics( 219 SkAdvancedTypefaceMetrics* SkRandomTypeface::onGetAdvancedTypefaceMetrics(
181 PerGlyphInfo info, 220 PerGlyphInfo info,
182 const uint32_t* glyphIDs, 221 const uint32_t* glyphIDs,
183 uint32_t glyphIDsCount) const { 222 uint32_t glyphIDsCount) const {
184 return fProxy->getAdvancedTypefaceMetrics(info, glyphIDs, glyphIDsCount); 223 return fProxy->getAdvancedTypefaceMetrics(info, glyphIDs, glyphIDsCount);
185 } 224 }
186 225
187 SkStreamAsset* SkGTypeface::onOpenStream(int* ttcIndex) const { 226 SkStreamAsset* SkRandomTypeface::onOpenStream(int* ttcIndex) const {
188 return fProxy->openStream(ttcIndex); 227 return fProxy->openStream(ttcIndex);
189 } 228 }
190 229
191 void SkGTypeface::onGetFontDescriptor(SkFontDescriptor* desc, 230 void SkRandomTypeface::onGetFontDescriptor(SkFontDescriptor* desc,
192 bool* isLocal) const { 231 bool* isLocal) const {
193 fProxy->getFontDescriptor(desc, isLocal); 232 fProxy->getFontDescriptor(desc, isLocal);
194 } 233 }
195 234
196 int SkGTypeface::onCharsToGlyphs(const void* chars, Encoding encoding, 235 int SkRandomTypeface::onCharsToGlyphs(const void* chars, Encoding encoding,
197 uint16_t glyphs[], int glyphCount) const { 236 uint16_t glyphs[], int glyphCount) const {
198 return fProxy->charsToGlyphs(chars, encoding, glyphs, glyphCount); 237 return fProxy->charsToGlyphs(chars, encoding, glyphs, glyphCount);
199 } 238 }
200 239
201 int SkGTypeface::onCountGlyphs() const { 240 int SkRandomTypeface::onCountGlyphs() const {
202 return fProxy->countGlyphs(); 241 return fProxy->countGlyphs();
203 } 242 }
204 243
205 int SkGTypeface::onGetUPEM() const { 244 int SkRandomTypeface::onGetUPEM() const {
206 return fProxy->getUnitsPerEm(); 245 return fProxy->getUnitsPerEm();
207 } 246 }
208 247
209 void SkGTypeface::onGetFamilyName(SkString* familyName) const { 248 void SkRandomTypeface::onGetFamilyName(SkString* familyName) const {
210 fProxy->getFamilyName(familyName); 249 fProxy->getFamilyName(familyName);
211 } 250 }
212 251
213 SkTypeface::LocalizedStrings* SkGTypeface::onCreateFamilyNameIterator() const { 252 SkTypeface::LocalizedStrings* SkRandomTypeface::onCreateFamilyNameIterator() con st {
214 return fProxy->createFamilyNameIterator(); 253 return fProxy->createFamilyNameIterator();
215 } 254 }
216 255
217 int SkGTypeface::onGetTableTags(SkFontTableTag tags[]) const { 256 int SkRandomTypeface::onGetTableTags(SkFontTableTag tags[]) const {
218 return fProxy->getTableTags(tags); 257 return fProxy->getTableTags(tags);
219 } 258 }
220 259
221 size_t SkGTypeface::onGetTableData(SkFontTableTag tag, size_t offset, 260 size_t SkRandomTypeface::onGetTableData(SkFontTableTag tag, size_t offset,
222 size_t length, void* data) const { 261 size_t length, void* data) const {
223 return fProxy->getTableData(tag, offset, length, data); 262 return fProxy->getTableData(tag, offset, length, data);
224 } 263 }
225 264
226 ///////////////////////////////////////////////////////////////////////////////
227
228 #if 0
229 // under construction -- defining a font purely in terms of skia primitives
230 // ala an SVG-font.
231 class SkGFont : public SkRefCnt {
232 public:
233 virtual ~SkGFont();
234
235 int unicharToGlyph(SkUnichar) const;
236
237 int countGlyphs() const { return fCount; }
238
239 float getAdvance(int index) const {
240 SkASSERT((unsigned)index < (unsigned)fCount);
241 return fGlyphs[index].fAdvance;
242 }
243
244 const SkPath& getPath(int index) const {
245 SkASSERT((unsigned)index < (unsigned)fCount);
246 return fGlyphs[index].fPath;
247 }
248
249 private:
250 struct Glyph {
251 SkUnichar fUni;
252 float fAdvance;
253 SkPath fPath;
254 };
255 int fCount;
256 Glyph* fGlyphs;
257
258 friend class SkGFontBuilder;
259 SkGFont(int count, Glyph* array);
260 };
261
262 class SkGFontBuilder {
263 public:
264
265 };
266 #endif
OLDNEW
« no previous file with comments | « src/fonts/SkRandomScalerContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698