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

Side by Side Diff: src/gpu/GrDistanceFieldTextContext.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/GrDistanceFieldTextContext.h ('k') | src/gpu/GrFlushToGpuDrawTarget.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 "GrDistanceFieldTextContext.h" 8 #include "GrDistanceFieldTextContext.h"
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrBitmapTextContext.h" 10 #include "GrBitmapTextContext.h"
11 #include "GrDrawTarget.h" 11 #include "GrDrawTarget.h"
12 #include "GrDrawTargetCaps.h" 12 #include "GrDrawTargetCaps.h"
13 #include "GrFontCache.h"
13 #include "GrFontScaler.h" 14 #include "GrFontScaler.h"
14 #include "GrGpu.h" 15 #include "GrGpu.h"
15 #include "GrIndexBuffer.h" 16 #include "GrIndexBuffer.h"
16 #include "GrStrokeInfo.h" 17 #include "GrStrokeInfo.h"
17 #include "GrTexturePriv.h" 18 #include "GrTexturePriv.h"
18 #include "GrTextStrike.h"
19 #include "GrTextStrike_impl.h"
20 19
21 #include "SkAutoKern.h" 20 #include "SkAutoKern.h"
22 #include "SkColorFilter.h" 21 #include "SkColorFilter.h"
23 #include "SkDistanceFieldGen.h" 22 #include "SkDistanceFieldGen.h"
24 #include "SkDraw.h" 23 #include "SkDraw.h"
25 #include "SkGlyphCache.h" 24 #include "SkGlyphCache.h"
26 #include "SkGpuDevice.h" 25 #include "SkGpuDevice.h"
27 #include "SkPath.h" 26 #include "SkPath.h"
28 #include "SkRTConf.h" 27 #include "SkRTConf.h"
29 #include "SkStrokeRec.h" 28 #include "SkStrokeRec.h"
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 params, flags)); 427 params, flags));
429 #endif 428 #endif
430 } 429 }
431 fEffectTextureUniqueID = textureUniqueID; 430 fEffectTextureUniqueID = textureUniqueID;
432 fEffectColor = filteredColor; 431 fEffectColor = filteredColor;
433 fEffectFlags = flags; 432 fEffectFlags = flags;
434 } 433 }
435 434
436 } 435 }
437 436
437 inline bool GrDistanceFieldTextContext::uploadGlyph(GrGlyph* glyph, GrFontScaler * scaler) {
438 if (!fStrike->glyphTooLargeForAtlas(glyph)) {
439 if (fStrike->addGlyphToAtlas(glyph, scaler)) {
440 return true;
441 }
442
443 // try to clear out an unused plot before we flush
444 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
445 fStrike->addGlyphToAtlas(glyph, scaler)) {
446 return true;
447 }
448
449 if (c_DumpFontCache) {
450 #ifdef SK_DEVELOPER
451 fContext->getFontCache()->dump();
452 #endif
453 }
454
455 // before we purge the cache, we must flush any accumulated draws
456 this->flush();
457 fContext->flush();
458
459 // we should have an unused plot now
460 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
461 fStrike->addGlyphToAtlas(glyph, scaler)) {
462 return true;
463 }
464
465 // we should never get here
466 SkASSERT(false);
467 }
468
469 return false;
470 }
471
472
438 // Returns true if this method handled the glyph, false if needs to be passed to fallback 473 // Returns true if this method handled the glyph, false if needs to be passed to fallback
439 // 474 //
440 bool GrDistanceFieldTextContext::appendGlyph(GrGlyph::PackedID packed, 475 bool GrDistanceFieldTextContext::appendGlyph(GrGlyph::PackedID packed,
441 SkScalar sx, SkScalar sy, 476 SkScalar sx, SkScalar sy,
442 GrFontScaler* scaler) { 477 GrFontScaler* scaler) {
443 if (NULL == fDrawTarget) { 478 if (NULL == fDrawTarget) {
444 return true; 479 return true;
445 } 480 }
446 481
447 if (NULL == fStrike) { 482 if (NULL == fStrike) {
(...skipping 29 matching lines...) Expand all
477 const SkMatrix& ctm = fContext->getMatrix(); 512 const SkMatrix& ctm = fContext->getMatrix();
478 (void) ctm.mapRect(&dstRect, glyphRect); 513 (void) ctm.mapRect(&dstRect, glyphRect);
479 if (fClipRect.quickReject(SkScalarTruncToInt(dstRect.left()), 514 if (fClipRect.quickReject(SkScalarTruncToInt(dstRect.left()),
480 SkScalarTruncToInt(dstRect.top()), 515 SkScalarTruncToInt(dstRect.top()),
481 SkScalarTruncToInt(dstRect.right()), 516 SkScalarTruncToInt(dstRect.right()),
482 SkScalarTruncToInt(dstRect.bottom()))) { 517 SkScalarTruncToInt(dstRect.bottom()))) {
483 // SkCLZ(3); // so we can set a break-point in the debugger 518 // SkCLZ(3); // so we can set a break-point in the debugger
484 return true; 519 return true;
485 } 520 }
486 521
487 if (NULL == glyph->fPlot) { 522 if (NULL == glyph->fPlot && !uploadGlyph(glyph, scaler)) {
488 if (!fStrike->glyphTooLargeForAtlas(glyph)) {
489 if (fStrike->addGlyphToAtlas(glyph, scaler)) {
490 goto HAS_ATLAS;
491 }
492
493 // try to clear out an unused plot before we flush
494 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
495 fStrike->addGlyphToAtlas(glyph, scaler)) {
496 goto HAS_ATLAS;
497 }
498
499 if (c_DumpFontCache) {
500 #ifdef SK_DEVELOPER
501 fContext->getFontCache()->dump();
502 #endif
503 }
504
505 // before we purge the cache, we must flush any accumulated draws
506 this->flush();
507 fContext->flush();
508
509 // we should have an unused plot now
510 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
511 fStrike->addGlyphToAtlas(glyph, scaler)) {
512 goto HAS_ATLAS;
513 }
514 }
515
516 if (NULL == glyph->fPath) { 523 if (NULL == glyph->fPath) {
517 SkPath* path = SkNEW(SkPath); 524 SkPath* path = SkNEW(SkPath);
518 if (!scaler->getGlyphPath(glyph->glyphID(), path)) { 525 if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
519 // flag the glyph as being dead? 526 // flag the glyph as being dead?
520 delete path; 527 delete path;
521 return true; 528 return true;
522 } 529 }
523 glyph->fPath = path; 530 glyph->fPath = path;
524 } 531 }
525 532
526 // flush any accumulated draws before drawing this glyph as a path. 533 // flush any accumulated draws before drawing this glyph as a path.
527 this->flush(); 534 this->flush();
528 535
529 GrContext::AutoMatrix am; 536 GrContext::AutoMatrix am;
530 SkMatrix ctm; 537 SkMatrix ctm;
531 ctm.setScale(fTextRatio, fTextRatio); 538 ctm.setScale(fTextRatio, fTextRatio);
532 ctm.postTranslate(sx - dx, sy - dy); 539 ctm.postTranslate(sx - dx, sy - dy);
533 GrPaint tmpPaint(fPaint); 540 GrPaint tmpPaint(fPaint);
534 am.setPreConcat(fContext, ctm, &tmpPaint); 541 am.setPreConcat(fContext, ctm, &tmpPaint);
535 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); 542 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle);
536 fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo); 543 fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo);
537 544
538 // remove this glyph from the vertices we need to allocate 545 // remove this glyph from the vertices we need to allocate
539 fTotalVertexCount -= kVerticesPerGlyph; 546 fTotalVertexCount -= kVerticesPerGlyph;
540 return true; 547 return true;
541 } 548 }
542 549
543 HAS_ATLAS:
544 SkASSERT(glyph->fPlot); 550 SkASSERT(glyph->fPlot);
545 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken(); 551 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken();
546 glyph->fPlot->setDrawToken(drawToken); 552 glyph->fPlot->setDrawToken(drawToken);
547 553
548 GrTexture* texture = glyph->fPlot->texture(); 554 GrTexture* texture = glyph->fPlot->texture();
549 SkASSERT(texture); 555 SkASSERT(texture);
550 556
551 if (fCurrTexture != texture || fCurrVertex + kVerticesPerGlyph > fTotalVerte xCount) { 557 if (fCurrTexture != texture || fCurrVertex + kVerticesPerGlyph > fTotalVerte xCount) {
552 this->flush(); 558 this->flush();
553 fCurrTexture = texture; 559 fCurrTexture = texture;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 } 678 }
673 } 679 }
674 680
675 inline void GrDistanceFieldTextContext::finish() { 681 inline void GrDistanceFieldTextContext::finish() {
676 this->flush(); 682 this->flush();
677 fTotalVertexCount = 0; 683 fTotalVertexCount = 0;
678 684
679 GrTextContext::finish(); 685 GrTextContext::finish();
680 } 686 }
681 687
OLDNEW
« no previous file with comments | « src/gpu/GrDistanceFieldTextContext.h ('k') | src/gpu/GrFlushToGpuDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698