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

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

Issue 780923002: Ganesh text rendering cleanup. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years 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/GrBitmapTextContext.h ('k') | src/gpu/GrContext.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 2013 Google Inc. 2 * Copyright 2013 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 "GrBitmapTextContext.h" 8 #include "GrBitmapTextContext.h"
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrDefaultGeoProcFactory.h" 10 #include "GrDefaultGeoProcFactory.h"
11 #include "GrDrawTarget.h" 11 #include "GrDrawTarget.h"
12 #include "GrFontCache.h"
12 #include "GrFontScaler.h" 13 #include "GrFontScaler.h"
13 #include "GrIndexBuffer.h" 14 #include "GrIndexBuffer.h"
14 #include "GrStrokeInfo.h" 15 #include "GrStrokeInfo.h"
15 #include "GrTexturePriv.h" 16 #include "GrTexturePriv.h"
16 #include "GrTextStrike.h"
17 #include "GrTextStrike_impl.h"
18 17
19 #include "SkAutoKern.h" 18 #include "SkAutoKern.h"
20 #include "SkColorPriv.h" 19 #include "SkColorPriv.h"
21 #include "SkDraw.h" 20 #include "SkDraw.h"
22 #include "SkDrawProcs.h" 21 #include "SkDrawProcs.h"
23 #include "SkGlyphCache.h" 22 #include "SkGlyphCache.h"
24 #include "SkGpuDevice.h" 23 #include "SkGpuDevice.h"
25 #include "SkGr.h" 24 #include "SkGr.h"
26 #include "SkPath.h" 25 #include "SkPath.h"
27 #include "SkRTConf.h" 26 #include "SkRTConf.h"
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 void* vertices = NULL; 351 void* vertices = NULL;
353 bool success = drawTarget->reserveVertexAndIndexSpace(numVertices, 352 bool success = drawTarget->reserveVertexAndIndexSpace(numVertices,
354 get_vertex_stride(mask Format), 353 get_vertex_stride(mask Format),
355 0, 354 0,
356 &vertices, 355 &vertices,
357 NULL); 356 NULL);
358 GrAlwaysAssert(success); 357 GrAlwaysAssert(success);
359 return vertices; 358 return vertices;
360 } 359 }
361 360
361 inline bool GrBitmapTextContext::uploadGlyph(GrGlyph* glyph, GrFontScaler* scale r) {
362 if (!fStrike->glyphTooLargeForAtlas(glyph)) {
363 if (fStrike->addGlyphToAtlas(glyph, scaler)) {
364 return true;
365 }
366
367 // try to clear out an unused plot before we flush
368 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
369 fStrike->addGlyphToAtlas(glyph, scaler)) {
370 return true;
371 }
372
373 if (c_DumpFontCache) {
374 #ifdef SK_DEVELOPER
375 fContext->getFontCache()->dump();
376 #endif
377 }
378
379 // before we purge the cache, we must flush any accumulated draws
380 this->flush();
381 fContext->flush();
382
383 // we should have an unused plot now
384 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
385 fStrike->addGlyphToAtlas(glyph, scaler)) {
386 return true;
387 }
388
389 // we should never get here
390 SkASSERT(false);
391 }
392
393 return false;
394 }
395
362 void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed, 396 void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed,
363 SkFixed vx, SkFixed vy, 397 SkFixed vx, SkFixed vy,
364 GrFontScaler* scaler) { 398 GrFontScaler* scaler) {
365 if (NULL == fDrawTarget) { 399 if (NULL == fDrawTarget) {
366 return; 400 return;
367 } 401 }
368 402
369 if (NULL == fStrike) { 403 if (NULL == fStrike) {
370 fStrike = fContext->getFontCache()->getStrike(scaler, false); 404 fStrike = fContext->getFontCache()->getStrike(scaler, false);
371 } 405 }
(...skipping 13 matching lines...) Expand all
385 // check if we clipped out 419 // check if we clipped out
386 if (true || NULL == glyph->fPlot) { 420 if (true || NULL == glyph->fPlot) {
387 int x = vx >> 16; 421 int x = vx >> 16;
388 int y = vy >> 16; 422 int y = vy >> 16;
389 if (fClipRect.quickReject(x, y, x + width, y + height)) { 423 if (fClipRect.quickReject(x, y, x + width, y + height)) {
390 // SkCLZ(3); // so we can set a break-point in the debugger 424 // SkCLZ(3); // so we can set a break-point in the debugger
391 return; 425 return;
392 } 426 }
393 } 427 }
394 428
395 if (NULL == glyph->fPlot) { 429 if (NULL == glyph->fPlot && !uploadGlyph(glyph, scaler)) {
396 if (!fStrike->glyphTooLargeForAtlas(glyph)) {
397 if (fStrike->addGlyphToAtlas(glyph, scaler)) {
398 goto HAS_ATLAS;
399 }
400
401 // try to clear out an unused plot before we flush
402 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
403 fStrike->addGlyphToAtlas(glyph, scaler)) {
404 goto HAS_ATLAS;
405 }
406
407 if (c_DumpFontCache) {
408 #ifdef SK_DEVELOPER
409 fContext->getFontCache()->dump();
410 #endif
411 }
412
413 // flush any accumulated draws to allow us to free up a plot
414 this->flush();
415 fContext->flush();
416
417 // we should have an unused plot now
418 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
419 fStrike->addGlyphToAtlas(glyph, scaler)) {
420 goto HAS_ATLAS;
421 }
422 }
423
424 if (NULL == glyph->fPath) { 430 if (NULL == glyph->fPath) {
425 SkPath* path = SkNEW(SkPath); 431 SkPath* path = SkNEW(SkPath);
426 if (!scaler->getGlyphPath(glyph->glyphID(), path)) { 432 if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
427 // flag the glyph as being dead? 433 // flag the glyph as being dead?
428 delete path; 434 delete path;
429 return; 435 return;
430 } 436 }
431 glyph->fPath = path; 437 glyph->fPath = path;
432 } 438 }
433 439
434 // flush any accumulated draws before drawing this glyph as a path. 440 // flush any accumulated draws before drawing this glyph as a path.
435 this->flush(); 441 this->flush();
436 442
437 GrContext::AutoMatrix am; 443 GrContext::AutoMatrix am;
438 SkMatrix translate; 444 SkMatrix translate;
439 translate.setTranslate(SkFixedToScalar(vx - SkIntToFixed(glyph->fBounds. fLeft)), 445 translate.setTranslate(SkFixedToScalar(vx - SkIntToFixed(glyph->fBounds. fLeft)),
440 SkFixedToScalar(vy - SkIntToFixed(glyph->fBounds. fTop))); 446 SkFixedToScalar(vy - SkIntToFixed(glyph->fBounds. fTop)));
441 GrPaint tmpPaint(fPaint); 447 GrPaint tmpPaint(fPaint);
442 am.setPreConcat(fContext, translate, &tmpPaint); 448 am.setPreConcat(fContext, translate, &tmpPaint);
443 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); 449 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle);
444 fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo); 450 fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo);
445 451
446 // remove this glyph from the vertices we need to allocate 452 // remove this glyph from the vertices we need to allocate
447 fTotalVertexCount -= kVerticesPerGlyph; 453 fTotalVertexCount -= kVerticesPerGlyph;
448 return; 454 return;
449 } 455 }
450 456
451 HAS_ATLAS:
452 SkASSERT(glyph->fPlot); 457 SkASSERT(glyph->fPlot);
453 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken(); 458 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken();
454 glyph->fPlot->setDrawToken(drawToken); 459 glyph->fPlot->setDrawToken(drawToken);
455 460
456 // now promote them to fixed (TODO: Rethink using fixed pt). 461 // now promote them to fixed (TODO: Rethink using fixed pt).
457 width = SkIntToFixed(width); 462 width = SkIntToFixed(width);
458 height = SkIntToFixed(height); 463 height = SkIntToFixed(height);
459 464
460 // the current texture/maskformat must match what the glyph needs 465 // the current texture/maskformat must match what the glyph needs
461 GrTexture* texture = glyph->fPlot->texture(); 466 GrTexture* texture = glyph->fPlot->texture();
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 } 617 }
613 } 618 }
614 619
615 inline void GrBitmapTextContext::finish() { 620 inline void GrBitmapTextContext::finish() {
616 this->flush(); 621 this->flush();
617 fTotalVertexCount = 0; 622 fTotalVertexCount = 0;
618 623
619 GrTextContext::finish(); 624 GrTextContext::finish();
620 } 625 }
621 626
OLDNEW
« no previous file with comments | « src/gpu/GrBitmapTextContext.h ('k') | src/gpu/GrContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698