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

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

Issue 1096753002: Small change to allow DistanceField and BMP text to coexist in a blob (Closed) Base URL: https://skia.googlesource.com/skia.git@atdfnow
Patch Set: warnings Created 5 years, 8 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/GrAtlasTextContext.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 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 #include "GrAtlasTextContext.h" 7 #include "GrAtlasTextContext.h"
8 8
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrBatch.h" 10 #include "GrBatch.h"
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 *textRatio = textSize / kLargeDFFontSize; 538 *textRatio = textSize / kLargeDFFontSize;
539 skPaint->setTextSize(SkIntToScalar(kLargeDFFontSize)); 539 skPaint->setTextSize(SkIntToScalar(kLargeDFFontSize));
540 } 540 }
541 541
542 skPaint->setLCDRenderText(false); 542 skPaint->setLCDRenderText(false);
543 skPaint->setAutohinted(false); 543 skPaint->setAutohinted(false);
544 skPaint->setHinting(SkPaint::kNormal_Hinting); 544 skPaint->setHinting(SkPaint::kNormal_Hinting);
545 skPaint->setSubpixelText(true); 545 skPaint->setSubpixelText(true);
546 } 546 }
547 547
548 inline void GrAtlasTextContext::fallbackDrawPosText(GrRenderTarget* rt, const Gr Clip& clip, 548 inline void GrAtlasTextContext::fallbackDrawPosText(BitmapTextBlob* blob,
549 GrRenderTarget* rt, const Gr Clip& clip,
549 const GrPaint& paint, 550 const GrPaint& paint,
550 const SkPaint& skPaint, 551 const SkPaint& skPaint,
551 const SkMatrix& viewMatrix, 552 const SkMatrix& viewMatrix,
552 const SkTDArray<char>& fallb ackTxt, 553 const SkTDArray<char>& fallb ackTxt,
553 const SkTDArray<SkScalar>& f allbackPos, 554 const SkTDArray<SkScalar>& f allbackPos,
554 int scalarsPerPosition, 555 int scalarsPerPosition,
555 const SkPoint& offset, 556 const SkPoint& offset,
556 const SkIRect& clipRect) { 557 const SkIRect& clipRect) {
557 int glyphCount = fallbackTxt.count(); 558 SkASSERT(fallbackTxt.count());
558 SkASSERT(glyphCount); 559 Run& run = blob->fRuns[0];
559 // TODO currently we have to create a whole new blob for fallback text. Thi s is because 560 PerSubRunInfo& subRun = run.fSubRunInfo.push_back();
560 // they have a different descriptor and we currently only have one descripto r per run. 561 subRun.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor));
561 // We should fix this and allow an override descriptor on each subrun 562 skPaint.getScalerContextDescriptor(subRun.fOverrideDescriptor,
562 SkAutoTUnref<BitmapTextBlob> blob(fCache->createBlob(glyphCount, 1, kGrayTex tVASize)); 563 &fDeviceProperties, &viewMatrix, false);
563 blob->fViewMatrix = viewMatrix; 564 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface,
564 565 subRun.fOverrideDescriptor-> getDesc());
565 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix , false);
566 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(), view Matrix, 566 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(), view Matrix,
567 fallbackTxt.begin(), fallbackTxt.count(), 567 fallbackTxt.begin(), fallbackTxt.count(),
568 fallbackPos.begin(), scalarsPerPosition, offset , clipRect); 568 fallbackPos.begin(), scalarsPerPosition, offset , clipRect);
569 SkGlyphCache::AttachCache(cache); 569 SkGlyphCache::AttachCache(cache);
570 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip);
571 } 570 }
572 571
573 inline GrAtlasTextContext::BitmapTextBlob* 572 inline GrAtlasTextContext::BitmapTextBlob*
574 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, 573 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint,
575 const SkMatrix& viewMatrix, SkGlyphCache** cache , 574 const SkMatrix& viewMatrix, SkGlyphCache** cache ,
576 SkPaint* dfPaint, SkScalar* textRatio) { 575 SkPaint* dfPaint, SkScalar* textRatio) {
577 BitmapTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); 576 BitmapTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize);
578 577
579 *dfPaint = origPaint; 578 *dfPaint = origPaint;
580 this->initDistanceFieldPaint(dfPaint, textRatio, viewMatrix); 579 this->initDistanceFieldPaint(dfPaint, textRatio, viewMatrix);
(...skipping 22 matching lines...) Expand all
603 SkAutoTUnref<BitmapTextBlob> blob(this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, 602 SkAutoTUnref<BitmapTextBlob> blob(this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache,
604 &dfPaint, &textRatio )); 603 &dfPaint, &textRatio ));
605 604
606 SkTDArray<char> fallbackTxt; 605 SkTDArray<char> fallbackTxt;
607 SkTDArray<SkScalar> fallbackPos; 606 SkTDArray<SkScalar> fallbackPos;
608 SkPoint offset; 607 SkPoint offset;
609 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view Matrix, text, 608 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view Matrix, text,
610 byteLength, x, y, clipRect, textRatio, &fallbac kTxt, &fallbackPos, 609 byteLength, x, y, clipRect, textRatio, &fallbac kTxt, &fallbackPos,
611 &offset, skPaint); 610 &offset, skPaint);
612 SkGlyphCache::AttachCache(cache); 611 SkGlyphCache::AttachCache(cache);
613 this->flush(fContext->getTextTarget(), blob, rt, dfPaint, paint, clip);
614 if (fallbackTxt.count()) { 612 if (fallbackTxt.count()) {
615 this->fallbackDrawPosText(rt, clip, paint, skPaint, viewMatrix, fall backTxt, 613 this->fallbackDrawPosText(blob, rt, clip, paint, skPaint, viewMatrix , fallbackTxt,
616 fallbackPos, 2, offset, clipRect); 614 fallbackPos, 2, offset, clipRect);
617 } 615 }
616 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip);
618 } else { 617 } else {
619 SkAutoTUnref<BitmapTextBlob> blob(fCache->createBlob(glyphCount, 1, kGra yTextVASize)); 618 SkAutoTUnref<BitmapTextBlob> blob(fCache->createBlob(glyphCount, 1, kGra yTextVASize));
620 blob->fViewMatrix = viewMatrix; 619 blob->fViewMatrix = viewMatrix;
621 620
622 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false); 621 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false);
623 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie wMatrix, text, 622 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie wMatrix, text,
624 byteLength, x, y, clipRect); 623 byteLength, x, y, clipRect);
625 SkGlyphCache::AttachCache(cache); 624 SkGlyphCache::AttachCache(cache);
626 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip); 625 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip);
627 } 626 }
(...skipping 16 matching lines...) Expand all
644 SkGlyphCache* cache; 643 SkGlyphCache* cache;
645 SkAutoTUnref<BitmapTextBlob> blob(this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, 644 SkAutoTUnref<BitmapTextBlob> blob(this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache,
646 &dfPaint, &textRatio )); 645 &dfPaint, &textRatio ));
647 646
648 SkTDArray<char> fallbackTxt; 647 SkTDArray<char> fallbackTxt;
649 SkTDArray<SkScalar> fallbackPos; 648 SkTDArray<SkScalar> fallbackPos;
650 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v iewMatrix, text, 649 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v iewMatrix, text,
651 byteLength, pos, scalarsPerPosition, offset, clipRect, 650 byteLength, pos, scalarsPerPosition, offset, clipRect,
652 textRatio, &fallbackTxt, &fallbackPos); 651 textRatio, &fallbackTxt, &fallbackPos);
653 SkGlyphCache::AttachCache(cache); 652 SkGlyphCache::AttachCache(cache);
654 this->flush(fContext->getTextTarget(), blob, rt, dfPaint, paint, clip);
655 if (fallbackTxt.count()) { 653 if (fallbackTxt.count()) {
656 this->fallbackDrawPosText(rt, clip, paint, skPaint, viewMatrix, fall backTxt, 654 this->fallbackDrawPosText(blob, rt, clip, paint, skPaint, viewMatrix , fallbackTxt,
657 fallbackPos, scalarsPerPosition, offset, c lipRect); 655 fallbackPos, scalarsPerPosition, offset, c lipRect);
658 } 656 }
657 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip);
659 } else { 658 } else {
660 SkAutoTUnref<BitmapTextBlob> blob(fCache->createBlob(glyphCount, 1, kGra yTextVASize)); 659 SkAutoTUnref<BitmapTextBlob> blob(fCache->createBlob(glyphCount, 1, kGra yTextVASize));
661 blob->fViewMatrix = viewMatrix; 660 blob->fViewMatrix = viewMatrix;
662 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false); 661 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false);
663 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(), viewMatrix, text, 662 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(), viewMatrix, text,
664 byteLength, pos, scalarsPerPosition, offset , clipRect); 663 byteLength, pos, scalarsPerPosition, offset , clipRect);
665 SkGlyphCache::AttachCache(cache); 664 SkGlyphCache::AttachCache(cache);
666 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip); 665 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip);
667 } 666 }
668 } 667 }
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 this->appendGlyphPath(blob, glyph, scaler, vx, vy); 1126 this->appendGlyphPath(blob, glyph, scaler, vx, vy);
1128 return; 1127 return;
1129 } 1128 }
1130 1129
1131 Run& run = blob->fRuns[runIndex]; 1130 Run& run = blob->fRuns[runIndex];
1132 1131
1133 GrMaskFormat format = glyph->fMaskFormat; 1132 GrMaskFormat format = glyph->fMaskFormat;
1134 1133
1135 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); 1134 PerSubRunInfo* subRun = &run.fSubRunInfo.back();
1136 if (run.fInitialized && subRun->fMaskFormat != format) { 1135 if (run.fInitialized && subRun->fMaskFormat != format) {
1137 PerSubRunInfo* newSubRun = &run.fSubRunInfo.push_back(); 1136 subRun = &run.fSubRunInfo.push_back();
1138 newSubRun->fGlyphStartIndex = subRun->fGlyphEndIndex;
1139 newSubRun->fGlyphEndIndex = subRun->fGlyphEndIndex;
1140
1141 newSubRun->fVertexStartIndex = subRun->fVertexEndIndex;
1142 newSubRun->fVertexEndIndex = subRun->fVertexEndIndex;
1143
1144 subRun = newSubRun;
1145 } 1137 }
1146 1138
1147 run.fInitialized = true; 1139 run.fInitialized = true;
1148 1140
1149 size_t vertexStride = get_vertex_stride(format); 1141 size_t vertexStride = get_vertex_stride(format);
1150 1142
1151 SkRect r; 1143 SkRect r;
1152 r.fLeft = SkIntToScalar(x); 1144 r.fLeft = SkIntToScalar(x);
1153 r.fTop = SkIntToScalar(y); 1145 r.fTop = SkIntToScalar(y);
1154 r.fRight = r.fLeft + SkIntToScalar(width); 1146 r.fRight = r.fLeft + SkIntToScalar(width);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 // should be pretty rare, so we just always regenerate in those case s 1460 // should be pretty rare, so we just always regenerate in those case s
1469 if (regenerateTextureCoords || regenerateColors || regeneratePositio ns) { 1461 if (regenerateTextureCoords || regenerateColors || regeneratePositio ns) {
1470 // first regenerate texture coordinates / colors if need be 1462 // first regenerate texture coordinates / colors if need be
1471 const SkDescriptor* desc = NULL; 1463 const SkDescriptor* desc = NULL;
1472 SkGlyphCache* cache = NULL; 1464 SkGlyphCache* cache = NULL;
1473 GrFontScaler* scaler = NULL; 1465 GrFontScaler* scaler = NULL;
1474 GrBatchTextStrike* strike = NULL; 1466 GrBatchTextStrike* strike = NULL;
1475 bool brokenRun = false; 1467 bool brokenRun = false;
1476 if (regenerateTextureCoords) { 1468 if (regenerateTextureCoords) {
1477 info.fBulkUseToken.reset(); 1469 info.fBulkUseToken.reset();
1478 desc = run.fDescriptor.getDesc(); 1470 desc = info.fOverrideDescriptor ? info.fOverrideDescriptor-> getDesc() :
1471 run.fDescriptor.getDesc();
1479 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); 1472 cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
1480 scaler = GrTextContext::GetGrFontScaler(cache); 1473 scaler = GrTextContext::GetGrFontScaler(cache);
1481 strike = fFontCache->getStrike(scaler); 1474 strike = fFontCache->getStrike(scaler);
1482 } 1475 }
1483 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { 1476 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
1484 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex]; 1477 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex];
1485 1478
1486 if (regenerateTextureCoords) { 1479 if (regenerateTextureCoords) {
1487 // Upload the glyph only if needed 1480 // Upload the glyph only if needed
1488 GrGlyph* glyph = strike->getGlyph(glyphID, scaler); 1481 GrGlyph* glyph = strike->getGlyph(glyphID, scaler);
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
2007 pipelineBuilder.setFromPaint(grPaint, rt, clip); 2000 pipelineBuilder.setFromPaint(grPaint, rt, clip);
2008 2001
2009 GrColor color = grPaint.getColor(); 2002 GrColor color = grPaint.getColor();
2010 for (int run = 0; run < cacheBlob->fRunCount; run++) { 2003 for (int run = 0; run < cacheBlob->fRunCount; run++) {
2011 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk Paint); 2004 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk Paint);
2012 } 2005 }
2013 2006
2014 // Now flush big glyphs 2007 // Now flush big glyphs
2015 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0); 2008 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0);
2016 } 2009 }
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698