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

Side by Side Diff: src/gpu/GrTextStrike.cpp

Issue 193163003: Enable use of distance fields via SkPaint flag. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Change HACK to TEMP Created 6 years, 9 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/gpu/GrTextStrike.h ('k') | src/gpu/GrTextStrike_impl.h » ('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 2010 Google Inc. 2 * Copyright 2010 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 "GrAtlas.h" 8 #include "GrAtlas.h"
9 #include "GrGpu.h" 9 #include "GrGpu.h"
10 #include "GrRectanizer.h" 10 #include "GrRectanizer.h"
11 #include "GrTextStrike.h" 11 #include "GrTextStrike.h"
12 #include "GrTextStrike_impl.h" 12 #include "GrTextStrike_impl.h"
13 #include "SkString.h" 13 #include "SkString.h"
14 14
15 #if SK_DISTANCEFIELD_FONTS
16 #include "SkDistanceFieldGen.h" 15 #include "SkDistanceFieldGen.h"
17 #endif
18 16
19 /////////////////////////////////////////////////////////////////////////////// 17 ///////////////////////////////////////////////////////////////////////////////
20 18
21 #define FONT_CACHE_STATS 0 19 #define FONT_CACHE_STATS 0
22 #if FONT_CACHE_STATS 20 #if FONT_CACHE_STATS
23 static int g_PurgeCount = 0; 21 static int g_PurgeCount = 0;
24 #endif 22 #endif
25 23
26 GrFontCache::GrFontCache(GrGpu* gpu) : fGpu(gpu) { 24 GrFontCache::GrFontCache(GrGpu* gpu) : fGpu(gpu) {
27 gpu->ref(); 25 gpu->ref();
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 ++gDumpCount; 189 ++gDumpCount;
192 } 190 }
193 #endif 191 #endif
194 192
195 /////////////////////////////////////////////////////////////////////////////// 193 ///////////////////////////////////////////////////////////////////////////////
196 194
197 #ifdef SK_DEBUG 195 #ifdef SK_DEBUG
198 static int gCounter; 196 static int gCounter;
199 #endif 197 #endif
200 198
201 #if SK_DISTANCEFIELD_FONTS
202 // this acts as the max magnitude for the distance field, 199 // this acts as the max magnitude for the distance field,
203 // as well as the pad we need around the glyph 200 // as well as the pad we need around the glyph
204 #define DISTANCE_FIELD_RANGE 4 201 #define DISTANCE_FIELD_RANGE 4
205 #endif
206 202
207 /* 203 /*
208 The text strike is specific to a given font/style/matrix setup, which is 204 The text strike is specific to a given font/style/matrix setup, which is
209 represented by the GrHostFontScaler object we are given in getGlyph(). 205 represented by the GrHostFontScaler object we are given in getGlyph().
210 206
211 We map a 32bit glyphID to a GrGlyph record, which in turn points to a 207 We map a 32bit glyphID to a GrGlyph record, which in turn points to a
212 atlas and a position within that texture. 208 atlas and a position within that texture.
213 */ 209 */
214 210
215 GrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key, 211 GrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key,
(...skipping 28 matching lines...) Expand all
244 } 240 }
245 241
246 GrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed, 242 GrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed,
247 GrFontScaler* scaler) { 243 GrFontScaler* scaler) {
248 SkIRect bounds; 244 SkIRect bounds;
249 if (!scaler->getPackedGlyphBounds(packed, &bounds)) { 245 if (!scaler->getPackedGlyphBounds(packed, &bounds)) {
250 return NULL; 246 return NULL;
251 } 247 }
252 248
253 GrGlyph* glyph = fPool.alloc(); 249 GrGlyph* glyph = fPool.alloc();
254 #if SK_DISTANCEFIELD_FONTS
255 // expand bounds to hold full distance field data 250 // expand bounds to hold full distance field data
256 if (fUseDistanceField) { 251 if (fUseDistanceField) {
257 bounds.fLeft -= DISTANCE_FIELD_RANGE; 252 bounds.fLeft -= DISTANCE_FIELD_RANGE;
258 bounds.fRight += DISTANCE_FIELD_RANGE; 253 bounds.fRight += DISTANCE_FIELD_RANGE;
259 bounds.fTop -= DISTANCE_FIELD_RANGE; 254 bounds.fTop -= DISTANCE_FIELD_RANGE;
260 bounds.fBottom += DISTANCE_FIELD_RANGE; 255 bounds.fBottom += DISTANCE_FIELD_RANGE;
261 } 256 }
262 #endif
263 glyph->init(packed, bounds); 257 glyph->init(packed, bounds);
264 fCache.insert(packed, glyph); 258 fCache.insert(packed, glyph);
265 return glyph; 259 return glyph;
266 } 260 }
267 261
268 void GrTextStrike::removePlot(const GrPlot* plot) { 262 void GrTextStrike::removePlot(const GrPlot* plot) {
269 SkTDArray<GrGlyph*>& glyphArray = fCache.getArray(); 263 SkTDArray<GrGlyph*>& glyphArray = fCache.getArray();
270 for (int i = 0; i < glyphArray.count(); ++i) { 264 for (int i = 0; i < glyphArray.count(); ++i) {
271 if (plot == glyphArray[i]->fPlot) { 265 if (plot == glyphArray[i]->fPlot) {
272 glyphArray[i]->fPlot = NULL; 266 glyphArray[i]->fPlot = NULL;
(...skipping 13 matching lines...) Expand all
286 SkASSERT(glyph); 280 SkASSERT(glyph);
287 SkASSERT(scaler); 281 SkASSERT(scaler);
288 SkASSERT(fCache.contains(glyph)); 282 SkASSERT(fCache.contains(glyph));
289 SkASSERT(NULL == glyph->fPlot); 283 SkASSERT(NULL == glyph->fPlot);
290 284
291 SkAutoRef ar(scaler); 285 SkAutoRef ar(scaler);
292 286
293 int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat); 287 int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat);
294 288
295 GrPlot* plot; 289 GrPlot* plot;
296 #if SK_DISTANCEFIELD_FONTS
297 if (fUseDistanceField) { 290 if (fUseDistanceField) {
298 // we've already expanded the glyph dimensions to match the final size 291 // we've already expanded the glyph dimensions to match the final size
299 // but must shrink back down to get the packed glyph data 292 // but must shrink back down to get the packed glyph data
300 int dfWidth = glyph->width(); 293 int dfWidth = glyph->width();
301 int dfHeight = glyph->height(); 294 int dfHeight = glyph->height();
302 int width = dfWidth - 2*DISTANCE_FIELD_RANGE; 295 int width = dfWidth - 2*DISTANCE_FIELD_RANGE;
303 int height = dfHeight - 2*DISTANCE_FIELD_RANGE; 296 int height = dfHeight - 2*DISTANCE_FIELD_RANGE;
304 int stride = width*bytesPerPixel; 297 int stride = width*bytesPerPixel;
305 298
306 size_t size = width * height * bytesPerPixel; 299 size_t size = width * height * bytesPerPixel;
(...skipping 27 matching lines...) Expand all
334 dfPtr += dfStride; 327 dfPtr += dfStride;
335 ptr += stride; 328 ptr += stride;
336 } 329 }
337 } 330 }
338 331
339 // copy to atlas 332 // copy to atlas
340 plot = fAtlasMgr->addToAtlas(&fAtlas, dfWidth, dfHeight, dfStorage.get() , 333 plot = fAtlasMgr->addToAtlas(&fAtlas, dfWidth, dfHeight, dfStorage.get() ,
341 &glyph->fAtlasLocation); 334 &glyph->fAtlasLocation);
342 335
343 } else { 336 } else {
344 #endif
345 size_t size = glyph->fBounds.area() * bytesPerPixel; 337 size_t size = glyph->fBounds.area() * bytesPerPixel;
346 SkAutoSMalloc<1024> storage(size); 338 SkAutoSMalloc<1024> storage(size);
347 if (!scaler->getPackedGlyphImage(glyph->fPackedID, glyph->width(), 339 if (!scaler->getPackedGlyphImage(glyph->fPackedID, glyph->width(),
348 glyph->height(), 340 glyph->height(),
349 glyph->width() * bytesPerPixel, 341 glyph->width() * bytesPerPixel,
350 storage.get())) { 342 storage.get())) {
351 return false; 343 return false;
352 } 344 }
353 345
354 plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(), 346 plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(),
355 glyph->height(), storage.get(), 347 glyph->height(), storage.get(),
356 &glyph->fAtlasLocation); 348 &glyph->fAtlasLocation);
357 #if SK_DISTANCEFIELD_FONTS
358 } 349 }
359 #endif
360 350
361 if (NULL == plot) { 351 if (NULL == plot) {
362 return false; 352 return false;
363 } 353 }
364 354
365 glyph->fPlot = plot; 355 glyph->fPlot = plot;
366 return true; 356 return true;
367 } 357 }
OLDNEW
« no previous file with comments | « src/gpu/GrTextStrike.h ('k') | src/gpu/GrTextStrike_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698