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

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

Issue 1249663002: rename BitmapTextBlob and move it to its own file (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nit Created 5 years, 5 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') | src/gpu/GrTextBlobCache.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 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 "GrBatch.h" 9 #include "GrBatch.h"
10 #include "GrBatchFontCache.h" 10 #include "GrBatchFontCache.h"
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 SkTextBlob::RunIterator it(blob); 237 SkTextBlob::RunIterator it(blob);
238 for (; !it.done(); it.next()) { 238 for (; !it.done(); it.next()) {
239 if (it.isLCD()) { 239 if (it.isLCD()) {
240 return true; 240 return true;
241 } 241 }
242 } 242 }
243 return false; 243 return false;
244 } 244 }
245 245
246 bool GrAtlasTextContext::MustRegenerateBlob(SkScalar* outTransX, SkScalar* outTr ansY, 246 bool GrAtlasTextContext::MustRegenerateBlob(SkScalar* outTransX, SkScalar* outTr ansY,
247 const BitmapTextBlob& blob, const Sk Paint& paint, 247 const GrAtlasTextBlob& blob, const S kPaint& paint,
248 const SkMaskFilter::BlurRec& blurRec , 248 const SkMaskFilter::BlurRec& blurRec ,
249 const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { 249 const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
250 // If we have LCD text then our canonical color will be set to transparent, in this case we have 250 // If we have LCD text then our canonical color will be set to transparent, in this case we have
251 // to regenerate the blob on any color change 251 // to regenerate the blob on any color change
252 if (blob.fKey.fCanonicalColor == SK_ColorTRANSPARENT && blob.fPaintColor != paint.getColor()) { 252 if (blob.fKey.fCanonicalColor == SK_ColorTRANSPARENT && blob.fPaintColor != paint.getColor()) {
253 return true; 253 return true;
254 } 254 }
255 255
256 if (blob.fViewMatrix.hasPerspective() != viewMatrix.hasPerspective()) { 256 if (blob.fViewMatrix.hasPerspective() != viewMatrix.hasPerspective()) {
257 return true; 257 return true;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 SkScalar newMaxScale = viewMatrix.getMaxScale(); 319 SkScalar newMaxScale = viewMatrix.getMaxScale();
320 SkScalar oldMaxScale = blob.fViewMatrix.getMaxScale(); 320 SkScalar oldMaxScale = blob.fViewMatrix.getMaxScale();
321 SkScalar scaleAdjust = newMaxScale / oldMaxScale; 321 SkScalar scaleAdjust = newMaxScale / oldMaxScale;
322 if (scaleAdjust < blob.fMaxMinScale || scaleAdjust > blob.fMinMaxScale) { 322 if (scaleAdjust < blob.fMaxMinScale || scaleAdjust > blob.fMinMaxScale) {
323 return true; 323 return true;
324 } 324 }
325 325
326 (*outTransX) = x - blob.fX; 326 (*outTransX) = x - blob.fX;
327 (*outTransY) = y - blob.fY; 327 (*outTransY) = y - blob.fY;
328 } 328 }
329
329 // It is possible that a blob has neither distanceField nor bitmaptext. Thi s is in the case 330 // It is possible that a blob has neither distanceField nor bitmaptext. Thi s is in the case
330 // when all of the runs inside the blob are drawn as paths. In this case, w e always regenerate 331 // when all of the runs inside the blob are drawn as paths. In this case, w e always regenerate
331 // the blob anyways at flush time, so no need to regenerate explicitly 332 // the blob anyways at flush time, so no need to regenerate explicitly
332
333 return false; 333 return false;
334 } 334 }
335 335
336 336
337 inline SkGlyphCache* GrAtlasTextContext::setupCache(BitmapTextBlob::Run* run, 337 inline SkGlyphCache* GrAtlasTextContext::setupCache(GrAtlasTextBlob::Run* run,
338 const SkPaint& skPaint, 338 const SkPaint& skPaint,
339 const SkMatrix* viewMatrix, 339 const SkMatrix* viewMatrix,
340 bool noGamma) { 340 bool noGamma) {
341 skPaint.getScalerContextDescriptor(&run->fDescriptor, fSurfaceProps, viewMat rix, noGamma); 341 skPaint.getScalerContextDescriptor(&run->fDescriptor, fSurfaceProps, viewMat rix, noGamma);
342 run->fTypeface.reset(SkSafeRef(skPaint.getTypeface())); 342 run->fTypeface.reset(SkSafeRef(skPaint.getTypeface()));
343 return SkGlyphCache::DetachCache(run->fTypeface, run->fDescriptor.getDesc()) ; 343 return SkGlyphCache::DetachCache(run->fTypeface, run->fDescriptor.getDesc()) ;
344 } 344 }
345 345
346 void GrAtlasTextContext::drawTextBlob(GrRenderTarget* rt, 346 void GrAtlasTextContext::drawTextBlob(GrRenderTarget* rt,
347 const GrClip& clip, const SkPaint& skPaint , 347 const GrClip& clip, const SkPaint& skPaint ,
348 const SkMatrix& viewMatrix, const SkTextBl ob* blob, 348 const SkMatrix& viewMatrix, const SkTextBl ob* blob,
349 SkScalar x, SkScalar y, 349 SkScalar x, SkScalar y,
350 SkDrawFilter* drawFilter, const SkIRect& c lipBounds) { 350 SkDrawFilter* drawFilter, const SkIRect& c lipBounds) {
351 // If we have been abandoned, then don't draw 351 // If we have been abandoned, then don't draw
352 if (fContext->abandoned()) { 352 if (fContext->abandoned()) {
353 return; 353 return;
354 } 354 }
355 355
356 SkAutoTUnref<BitmapTextBlob> cacheBlob; 356 SkAutoTUnref<GrAtlasTextBlob> cacheBlob;
357 SkMaskFilter::BlurRec blurRec; 357 SkMaskFilter::BlurRec blurRec;
358 BitmapTextBlob::Key key; 358 GrAtlasTextBlob::Key key;
359 // It might be worth caching these things, but its not clear at this time 359 // It might be worth caching these things, but its not clear at this time
360 // TODO for animated mask filters, this will fill up our cache. We need a s afeguard here 360 // TODO for animated mask filters, this will fill up our cache. We need a s afeguard here
361 const SkMaskFilter* mf = skPaint.getMaskFilter(); 361 const SkMaskFilter* mf = skPaint.getMaskFilter();
362 bool canCache = !(skPaint.getPathEffect() || 362 bool canCache = !(skPaint.getPathEffect() ||
363 (mf && !mf->asABlur(&blurRec)) || 363 (mf && !mf->asABlur(&blurRec)) ||
364 drawFilter); 364 drawFilter);
365 365
366 if (canCache) { 366 if (canCache) {
367 bool hasLCD = HasLCD(blob); 367 bool hasLCD = HasLCD(blob);
368 368
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 } 463 }
464 464
465 // TODO: add some stroking support 465 // TODO: add some stroking support
466 if (skPaint.getStyle() != SkPaint::kFill_Style) { 466 if (skPaint.getStyle() != SkPaint::kFill_Style) {
467 return false; 467 return false;
468 } 468 }
469 469
470 return true; 470 return true;
471 } 471 }
472 472
473 void GrAtlasTextContext::regenerateTextBlob(BitmapTextBlob* cacheBlob, 473 void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob,
474 const SkPaint& skPaint, GrColor colo r, 474 const SkPaint& skPaint, GrColor colo r,
475 const SkMatrix& viewMatrix, 475 const SkMatrix& viewMatrix,
476 const SkTextBlob* blob, SkScalar x, SkScalar y, 476 const SkTextBlob* blob, SkScalar x, SkScalar y,
477 SkDrawFilter* drawFilter, const SkIR ect& clipRect, 477 SkDrawFilter* drawFilter, const SkIR ect& clipRect,
478 GrRenderTarget* rt, const GrClip& cl ip, 478 GrRenderTarget* rt, const GrClip& cl ip,
479 const GrPaint& paint) { 479 const GrPaint& paint) {
480 cacheBlob->fViewMatrix = viewMatrix; 480 cacheBlob->fViewMatrix = viewMatrix;
481 cacheBlob->fX = x; 481 cacheBlob->fX = x;
482 cacheBlob->fY = y; 482 cacheBlob->fY = y;
483 483
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 SkGlyphCache::AttachCache(cache); 587 SkGlyphCache::AttachCache(cache);
588 } 588 }
589 589
590 if (drawFilter) { 590 if (drawFilter) {
591 // A draw filter may change the paint arbitrarily, so we must re-see d in this case. 591 // A draw filter may change the paint arbitrarily, so we must re-see d in this case.
592 runPaint = skPaint; 592 runPaint = skPaint;
593 } 593 }
594 } 594 }
595 } 595 }
596 596
597 inline void GrAtlasTextContext::initDistanceFieldPaint(BitmapTextBlob* blob, 597 inline void GrAtlasTextContext::initDistanceFieldPaint(GrAtlasTextBlob* blob,
598 SkPaint* skPaint, 598 SkPaint* skPaint,
599 SkScalar* textRatio, 599 SkScalar* textRatio,
600 const SkMatrix& viewMatri x) { 600 const SkMatrix& viewMatri x) {
601 // getMaxScale doesn't support perspective, so neither do we at the moment 601 // getMaxScale doesn't support perspective, so neither do we at the moment
602 SkASSERT(!viewMatrix.hasPerspective()); 602 SkASSERT(!viewMatrix.hasPerspective());
603 SkScalar maxScale = viewMatrix.getMaxScale(); 603 SkScalar maxScale = viewMatrix.getMaxScale();
604 SkScalar textSize = skPaint->getTextSize(); 604 SkScalar textSize = skPaint->getTextSize();
605 SkScalar scaledTextSize = textSize; 605 SkScalar scaledTextSize = textSize;
606 // if we have non-unity scale, we need to choose our base text size 606 // if we have non-unity scale, we need to choose our base text size
607 // based on the SkPaint's text size multiplied by the max scale factor 607 // based on the SkPaint's text size multiplied by the max scale factor
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 SkASSERT(dfMaskScaleFloor <= scaledTextSize && scaledTextSize <= dfMaskScale Ceil); 641 SkASSERT(dfMaskScaleFloor <= scaledTextSize && scaledTextSize <= dfMaskScale Ceil);
642 blob->fMaxMinScale = SkMaxScalar(dfMaskScaleFloor / scaledTextSize, blob->fM axMinScale); 642 blob->fMaxMinScale = SkMaxScalar(dfMaskScaleFloor / scaledTextSize, blob->fM axMinScale);
643 blob->fMinMaxScale = SkMinScalar(dfMaskScaleCeil / scaledTextSize, blob->fMi nMaxScale); 643 blob->fMinMaxScale = SkMinScalar(dfMaskScaleCeil / scaledTextSize, blob->fMi nMaxScale);
644 644
645 skPaint->setLCDRenderText(false); 645 skPaint->setLCDRenderText(false);
646 skPaint->setAutohinted(false); 646 skPaint->setAutohinted(false);
647 skPaint->setHinting(SkPaint::kNormal_Hinting); 647 skPaint->setHinting(SkPaint::kNormal_Hinting);
648 skPaint->setSubpixelText(true); 648 skPaint->setSubpixelText(true);
649 } 649 }
650 650
651 inline void GrAtlasTextContext::fallbackDrawPosText(BitmapTextBlob* blob, 651 inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob,
652 int runIndex, 652 int runIndex,
653 GrRenderTarget* rt, const Gr Clip& clip, 653 GrRenderTarget* rt, const Gr Clip& clip,
654 const GrPaint& paint, 654 const GrPaint& paint,
655 const SkPaint& skPaint, 655 const SkPaint& skPaint,
656 const SkMatrix& viewMatrix, 656 const SkMatrix& viewMatrix,
657 const SkTDArray<char>& fallb ackTxt, 657 const SkTDArray<char>& fallb ackTxt,
658 const SkTDArray<SkScalar>& f allbackPos, 658 const SkTDArray<SkScalar>& f allbackPos,
659 int scalarsPerPosition, 659 int scalarsPerPosition,
660 const SkPoint& offset, 660 const SkPoint& offset,
661 const SkIRect& clipRect) { 661 const SkIRect& clipRect) {
662 SkASSERT(fallbackTxt.count()); 662 SkASSERT(fallbackTxt.count());
663 blob->setHasBitmap(); 663 blob->setHasBitmap();
664 Run& run = blob->fRuns[runIndex]; 664 Run& run = blob->fRuns[runIndex];
665 // Push back a new subrun to fill and set the override descriptor 665 // Push back a new subrun to fill and set the override descriptor
666 run.push_back(); 666 run.push_back();
667 run.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor)); 667 run.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor));
668 skPaint.getScalerContextDescriptor(run.fOverrideDescriptor, 668 skPaint.getScalerContextDescriptor(run.fOverrideDescriptor,
669 fSurfaceProps, &viewMatrix, false); 669 fSurfaceProps, &viewMatrix, false);
670 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, 670 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface,
671 run.fOverrideDescriptor->get Desc()); 671 run.fOverrideDescriptor->get Desc());
672 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor( ), viewMatrix, 672 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor( ), viewMatrix,
673 fallbackTxt.begin(), fallbackTxt.count(), 673 fallbackTxt.begin(), fallbackTxt.count(),
674 fallbackPos.begin(), scalarsPerPosition, offset , clipRect); 674 fallbackPos.begin(), scalarsPerPosition, offset , clipRect);
675 SkGlyphCache::AttachCache(cache); 675 SkGlyphCache::AttachCache(cache);
676 } 676 }
677 677
678 inline GrAtlasTextContext::BitmapTextBlob* 678 inline GrAtlasTextBlob*
679 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, 679 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint,
680 const SkMatrix& viewMatrix, SkGlyphCache** cache , 680 const SkMatrix& viewMatrix, SkGlyphCache** cache ,
681 SkPaint* dfPaint, SkScalar* textRatio) { 681 SkPaint* dfPaint, SkScalar* textRatio) {
682 BitmapTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); 682 GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize);
683 683
684 *dfPaint = origPaint; 684 *dfPaint = origPaint;
685 this->initDistanceFieldPaint(blob, dfPaint, textRatio, viewMatrix); 685 this->initDistanceFieldPaint(blob, dfPaint, textRatio, viewMatrix);
686 blob->fViewMatrix = viewMatrix; 686 blob->fViewMatrix = viewMatrix;
687 Run& run = blob->fRuns[0]; 687 Run& run = blob->fRuns[0];
688 PerSubRunInfo& subRun = run.fSubRunInfo.back(); 688 PerSubRunInfo& subRun = run.fSubRunInfo.back();
689 subRun.fUseLCDText = origPaint.isLCDRenderText(); 689 subRun.fUseLCDText = origPaint.isLCDRenderText();
690 subRun.fDrawAsDistanceFields = true; 690 subRun.fDrawAsDistanceFields = true;
691 691
692 *cache = this->setupCache(&blob->fRuns[0], *dfPaint, NULL, true); 692 *cache = this->setupCache(&blob->fRuns[0], *dfPaint, NULL, true);
693 return blob; 693 return blob;
694 } 694 }
695 695
696 inline GrAtlasTextContext::BitmapTextBlob* 696 inline GrAtlasTextBlob*
697 GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, 697 GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip,
698 const GrPaint& paint, const SkPaint& skPa int, 698 const GrPaint& paint, const SkPaint& skPa int,
699 const SkMatrix& viewMatrix, 699 const SkMatrix& viewMatrix,
700 const char text[], size_t byteLength, 700 const char text[], size_t byteLength,
701 SkScalar x, SkScalar y, const SkIRect& re gionClipBounds) { 701 SkScalar x, SkScalar y, const SkIRect& re gionClipBounds) {
702 int glyphCount = skPaint.countText(text, byteLength); 702 int glyphCount = skPaint.countText(text, byteLength);
703 SkIRect clipRect; 703 SkIRect clipRect;
704 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); 704 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect);
705 705
706 BitmapTextBlob* blob; 706 GrAtlasTextBlob* blob;
707 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { 707 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) {
708 SkPaint dfPaint; 708 SkPaint dfPaint;
709 SkScalar textRatio; 709 SkScalar textRatio;
710 SkGlyphCache* cache; 710 SkGlyphCache* cache;
711 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai nt, &textRatio); 711 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai nt, &textRatio);
712 712
713 SkTDArray<char> fallbackTxt; 713 SkTDArray<char> fallbackTxt;
714 SkTDArray<SkScalar> fallbackPos; 714 SkTDArray<SkScalar> fallbackPos;
715 SkPoint offset; 715 SkPoint offset;
716 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view Matrix, text, 716 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view Matrix, text,
717 byteLength, x, y, clipRect, textRatio, &fallbac kTxt, &fallbackPos, 717 byteLength, x, y, clipRect, textRatio, &fallbac kTxt, &fallbackPos,
718 &offset, skPaint); 718 &offset, skPaint);
719 SkGlyphCache::AttachCache(cache); 719 SkGlyphCache::AttachCache(cache);
720 if (fallbackTxt.count()) { 720 if (fallbackTxt.count()) {
721 this->fallbackDrawPosText(blob, 0, rt, clip, paint, skPaint, viewMat rix, fallbackTxt, 721 this->fallbackDrawPosText(blob, 0, rt, clip, paint, skPaint, viewMat rix, fallbackTxt,
722 fallbackPos, 2, offset, clipRect); 722 fallbackPos, 2, offset, clipRect);
723 } 723 }
724 } else { 724 } else {
725 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); 725 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize);
726 blob->fViewMatrix = viewMatrix; 726 blob->fViewMatrix = viewMatrix;
727 727
728 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false); 728 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false);
729 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie wMatrix, text, 729 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie wMatrix, text,
730 byteLength, x, y, clipRect); 730 byteLength, x, y, clipRect);
731 SkGlyphCache::AttachCache(cache); 731 SkGlyphCache::AttachCache(cache);
732 } 732 }
733 return blob; 733 return blob;
734 } 734 }
735 735
736 inline GrAtlasTextContext::BitmapTextBlob* 736 inline GrAtlasTextBlob*
737 GrAtlasTextContext::createDrawPosTextBlob(GrRenderTarget* rt, const GrClip& clip , 737 GrAtlasTextContext::createDrawPosTextBlob(GrRenderTarget* rt, const GrClip& clip ,
738 const GrPaint& paint, const SkPaint& s kPaint, 738 const GrPaint& paint, const SkPaint& s kPaint,
739 const SkMatrix& viewMatrix, 739 const SkMatrix& viewMatrix,
740 const char text[], size_t byteLength, 740 const char text[], size_t byteLength,
741 const SkScalar pos[], int scalarsPerPo sition, 741 const SkScalar pos[], int scalarsPerPo sition,
742 const SkPoint& offset, const SkIRect& regionClipBounds) { 742 const SkPoint& offset, const SkIRect& regionClipBounds) {
743 int glyphCount = skPaint.countText(text, byteLength); 743 int glyphCount = skPaint.countText(text, byteLength);
744 744
745 SkIRect clipRect; 745 SkIRect clipRect;
746 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); 746 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect);
747 747
748 BitmapTextBlob* blob; 748 GrAtlasTextBlob* blob;
749 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { 749 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) {
750 SkPaint dfPaint; 750 SkPaint dfPaint;
751 SkScalar textRatio; 751 SkScalar textRatio;
752 SkGlyphCache* cache; 752 SkGlyphCache* cache;
753 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai nt, &textRatio); 753 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai nt, &textRatio);
754 754
755 SkTDArray<char> fallbackTxt; 755 SkTDArray<char> fallbackTxt;
756 SkTDArray<SkScalar> fallbackPos; 756 SkTDArray<SkScalar> fallbackPos;
757 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v iewMatrix, text, 757 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v iewMatrix, text,
758 byteLength, pos, scalarsPerPosition, offset, clipRect, 758 byteLength, pos, scalarsPerPosition, offset, clipRect,
(...skipping 13 matching lines...) Expand all
772 } 772 }
773 return blob; 773 return blob;
774 } 774 }
775 775
776 void GrAtlasTextContext::onDrawText(GrRenderTarget* rt, 776 void GrAtlasTextContext::onDrawText(GrRenderTarget* rt,
777 const GrClip& clip, 777 const GrClip& clip,
778 const GrPaint& paint, const SkPaint& skPaint , 778 const GrPaint& paint, const SkPaint& skPaint ,
779 const SkMatrix& viewMatrix, 779 const SkMatrix& viewMatrix,
780 const char text[], size_t byteLength, 780 const char text[], size_t byteLength,
781 SkScalar x, SkScalar y, const SkIRect& regio nClipBounds) { 781 SkScalar x, SkScalar y, const SkIRect& regio nClipBounds) {
782 SkAutoTUnref<BitmapTextBlob> blob( 782 SkAutoTUnref<GrAtlasTextBlob> blob(
783 this->createDrawTextBlob(rt, clip, paint, skPaint, viewMatrix, 783 this->createDrawTextBlob(rt, clip, paint, skPaint, viewMatrix,
784 text, byteLength, x, y, regionClipBounds)); 784 text, byteLength, x, y, regionClipBounds));
785 this->flush(blob, rt, skPaint, paint, clip, regionClipBounds); 785 this->flush(blob, rt, skPaint, paint, clip, regionClipBounds);
786 } 786 }
787 787
788 void GrAtlasTextContext::onDrawPosText(GrRenderTarget* rt, 788 void GrAtlasTextContext::onDrawPosText(GrRenderTarget* rt,
789 const GrClip& clip, 789 const GrClip& clip,
790 const GrPaint& paint, const SkPaint& skPa int, 790 const GrPaint& paint, const SkPaint& skPa int,
791 const SkMatrix& viewMatrix, 791 const SkMatrix& viewMatrix,
792 const char text[], size_t byteLength, 792 const char text[], size_t byteLength,
793 const SkScalar pos[], int scalarsPerPosit ion, 793 const SkScalar pos[], int scalarsPerPosit ion,
794 const SkPoint& offset, const SkIRect& reg ionClipBounds) { 794 const SkPoint& offset, const SkIRect& reg ionClipBounds) {
795 SkAutoTUnref<BitmapTextBlob> blob( 795 SkAutoTUnref<GrAtlasTextBlob> blob(
796 this->createDrawPosTextBlob(rt, clip, paint, skPaint, viewMatrix, 796 this->createDrawPosTextBlob(rt, clip, paint, skPaint, viewMatrix,
797 text, byteLength, 797 text, byteLength,
798 pos, scalarsPerPosition, 798 pos, scalarsPerPosition,
799 offset, regionClipBounds)); 799 offset, regionClipBounds));
800 800
801 this->flush(blob, rt, skPaint, paint, clip, regionClipBounds); 801 this->flush(blob, rt, skPaint, paint, clip, regionClipBounds);
802 } 802 }
803 803
804 void GrAtlasTextContext::internalDrawBMPText(BitmapTextBlob* blob, int runIndex, 804 void GrAtlasTextContext::internalDrawBMPText(GrAtlasTextBlob* blob, int runIndex ,
805 SkGlyphCache* cache, const SkPaint& skPaint, 805 SkGlyphCache* cache, const SkPaint& skPaint,
806 GrColor color, 806 GrColor color,
807 const SkMatrix& viewMatrix, 807 const SkMatrix& viewMatrix,
808 const char text[], size_t byteLengt h, 808 const char text[], size_t byteLengt h,
809 SkScalar x, SkScalar y, const SkIRe ct& clipRect) { 809 SkScalar x, SkScalar y, const SkIRe ct& clipRect) {
810 SkASSERT(byteLength == 0 || text != NULL); 810 SkASSERT(byteLength == 0 || text != NULL);
811 811
812 // nothing to draw 812 // nothing to draw
813 if (text == NULL || byteLength == 0) { 813 if (text == NULL || byteLength == 0) {
814 return; 814 return;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 color, 885 color,
886 fontScaler, 886 fontScaler,
887 clipRect); 887 clipRect);
888 } 888 }
889 889
890 fx += glyph.fAdvanceX; 890 fx += glyph.fAdvanceX;
891 fy += glyph.fAdvanceY; 891 fy += glyph.fAdvanceY;
892 } 892 }
893 } 893 }
894 894
895 void GrAtlasTextContext::internalDrawBMPPosText(BitmapTextBlob* blob, int runInd ex, 895 void GrAtlasTextContext::internalDrawBMPPosText(GrAtlasTextBlob* blob, int runIn dex,
896 SkGlyphCache* cache, const SkPai nt& skPaint, 896 SkGlyphCache* cache, const SkPai nt& skPaint,
897 GrColor color, 897 GrColor color,
898 const SkMatrix& viewMatrix, 898 const SkMatrix& viewMatrix,
899 const char text[], size_t byteLe ngth, 899 const char text[], size_t byteLe ngth,
900 const SkScalar pos[], int scalar sPerPosition, 900 const SkScalar pos[], int scalar sPerPosition,
901 const SkPoint& offset, const SkI Rect& clipRect) { 901 const SkPoint& offset, const SkI Rect& clipRect) {
902 SkASSERT(byteLength == 0 || text != NULL); 902 SkASSERT(byteLength == 0 || text != NULL);
903 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 903 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
904 904
905 // nothing to draw 905 // nothing to draw
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 fontScaler, 1050 fontScaler,
1051 clipRect); 1051 clipRect);
1052 } 1052 }
1053 pos += scalarsPerPosition; 1053 pos += scalarsPerPosition;
1054 } 1054 }
1055 } 1055 }
1056 } 1056 }
1057 } 1057 }
1058 1058
1059 1059
1060 void GrAtlasTextContext::internalDrawDFText(BitmapTextBlob* blob, int runIndex, 1060 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
1061 SkGlyphCache* cache, const SkPaint& skPaint, 1061 SkGlyphCache* cache, const SkPaint& skPaint,
1062 GrColor color, 1062 GrColor color,
1063 const SkMatrix& viewMatrix, 1063 const SkMatrix& viewMatrix,
1064 const char text[], size_t byteLength , 1064 const char text[], size_t byteLength ,
1065 SkScalar x, SkScalar y, const SkIRec t& clipRect, 1065 SkScalar x, SkScalar y, const SkIRec t& clipRect,
1066 SkScalar textRatio, 1066 SkScalar textRatio,
1067 SkTDArray<char>* fallbackTxt, 1067 SkTDArray<char>* fallbackTxt,
1068 SkTDArray<SkScalar>* fallbackPos, 1068 SkTDArray<SkScalar>* fallbackPos,
1069 SkPoint* offset, 1069 SkPoint* offset,
1070 const SkPaint& origPaint) { 1070 const SkPaint& origPaint) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 x -= alignX; 1124 x -= alignX;
1125 y -= alignY; 1125 y -= alignY;
1126 *offset = SkPoint::Make(x, y); 1126 *offset = SkPoint::Make(x, y);
1127 1127
1128 this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatri x, text, byteLength, 1128 this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatri x, text, byteLength,
1129 positions.begin(), 2, *offset, clipRect, textRat io, fallbackTxt, 1129 positions.begin(), 2, *offset, clipRect, textRat io, fallbackTxt,
1130 fallbackPos); 1130 fallbackPos);
1131 SkGlyphCache::AttachCache(origPaintCache); 1131 SkGlyphCache::AttachCache(origPaintCache);
1132 } 1132 }
1133 1133
1134 void GrAtlasTextContext::internalDrawDFPosText(BitmapTextBlob* blob, int runInde x, 1134 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd ex,
1135 SkGlyphCache* cache, const SkPain t& skPaint, 1135 SkGlyphCache* cache, const SkPain t& skPaint,
1136 GrColor color, 1136 GrColor color,
1137 const SkMatrix& viewMatrix, 1137 const SkMatrix& viewMatrix,
1138 const char text[], size_t byteLen gth, 1138 const char text[], size_t byteLen gth,
1139 const SkScalar pos[], int scalars PerPosition, 1139 const SkScalar pos[], int scalars PerPosition,
1140 const SkPoint& offset, const SkIR ect& clipRect, 1140 const SkPoint& offset, const SkIR ect& clipRect,
1141 SkScalar textRatio, 1141 SkScalar textRatio,
1142 SkTDArray<char>* fallbackTxt, 1142 SkTDArray<char>* fallbackTxt,
1143 SkTDArray<SkScalar>* fallbackPos) { 1143 SkTDArray<SkScalar>* fallbackPos) {
1144 1144
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 if (2 == scalarsPerPosition) { 1217 if (2 == scalarsPerPosition) {
1218 *fallbackPos->append() = pos[1]; 1218 *fallbackPos->append() = pos[1];
1219 } 1219 }
1220 } 1220 }
1221 } 1221 }
1222 pos += scalarsPerPosition; 1222 pos += scalarsPerPosition;
1223 } 1223 }
1224 } 1224 }
1225 } 1225 }
1226 1226
1227 void GrAtlasTextContext::bmpAppendGlyph(BitmapTextBlob* blob, int runIndex, 1227 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
1228 GrGlyph::PackedID packed, 1228 GrGlyph::PackedID packed,
1229 int vx, int vy, GrColor color, GrFontSca ler* scaler, 1229 int vx, int vy, GrColor color, GrFontSca ler* scaler,
1230 const SkIRect& clipRect) { 1230 const SkIRect& clipRect) {
1231 Run& run = blob->fRuns[runIndex]; 1231 Run& run = blob->fRuns[runIndex];
1232 if (!fCurrStrike) { 1232 if (!fCurrStrike) {
1233 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); 1233 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
1234 run.fStrike.reset(SkRef(fCurrStrike)); 1234 run.fStrike.reset(SkRef(fCurrStrike));
1235 } 1235 }
1236 1236
1237 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); 1237 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 SkRect r; 1278 SkRect r;
1279 r.fLeft = SkIntToScalar(x); 1279 r.fLeft = SkIntToScalar(x);
1280 r.fTop = SkIntToScalar(y); 1280 r.fTop = SkIntToScalar(y);
1281 r.fRight = r.fLeft + SkIntToScalar(width); 1281 r.fRight = r.fLeft + SkIntToScalar(width);
1282 r.fBottom = r.fTop + SkIntToScalar(height); 1282 r.fBottom = r.fTop + SkIntToScalar(height);
1283 subRun->fMaskFormat = format; 1283 subRun->fMaskFormat = format;
1284 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa skFormat == format, 1284 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa skFormat == format,
1285 glyph); 1285 glyph);
1286 } 1286 }
1287 1287
1288 bool GrAtlasTextContext::dfAppendGlyph(BitmapTextBlob* blob, int runIndex, 1288 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
1289 GrGlyph::PackedID packed, 1289 GrGlyph::PackedID packed,
1290 SkScalar sx, SkScalar sy, GrColor color, 1290 SkScalar sx, SkScalar sy, GrColor color,
1291 GrFontScaler* scaler, 1291 GrFontScaler* scaler,
1292 const SkIRect& clipRect, 1292 const SkIRect& clipRect,
1293 SkScalar textRatio, const SkMatrix& viewM atrix) { 1293 SkScalar textRatio, const SkMatrix& viewM atrix) {
1294 Run& run = blob->fRuns[runIndex]; 1294 Run& run = blob->fRuns[runIndex];
1295 if (!fCurrStrike) { 1295 if (!fCurrStrike) {
1296 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); 1296 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
1297 run.fStrike.reset(SkRef(fCurrStrike)); 1297 run.fStrike.reset(SkRef(fCurrStrike));
1298 } 1298 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 subRun->fMaskFormat = kA8_GrMaskFormat; 1345 subRun->fMaskFormat = kA8_GrMaskFormat;
1346 1346
1347 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD Text); 1347 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD Text);
1348 1348
1349 bool useColorVerts = !subRun->fUseLCDText; 1349 bool useColorVerts = !subRun->fUseLCDText;
1350 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride, useColorVerts, 1350 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride, useColorVerts,
1351 glyph); 1351 glyph);
1352 return true; 1352 return true;
1353 } 1353 }
1354 1354
1355 inline void GrAtlasTextContext::appendGlyphPath(BitmapTextBlob* blob, GrGlyph* g lyph, 1355 inline void GrAtlasTextContext::appendGlyphPath(GrAtlasTextBlob* blob, GrGlyph* glyph,
1356 GrFontScaler* scaler, SkScalar x , SkScalar y) { 1356 GrFontScaler* scaler, SkScalar x , SkScalar y) {
1357 if (NULL == glyph->fPath) { 1357 if (NULL == glyph->fPath) {
1358 SkPath* path = SkNEW(SkPath); 1358 SkPath* path = SkNEW(SkPath);
1359 if (!scaler->getGlyphPath(glyph->glyphID(), path)) { 1359 if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
1360 // flag the glyph as being dead? 1360 // flag the glyph as being dead?
1361 SkDELETE(path); 1361 SkDELETE(path);
1362 return; 1362 return;
1363 } 1363 }
1364 glyph->fPath = path; 1364 glyph->fPath = path;
1365 } 1365 }
1366 SkASSERT(glyph->fPath); 1366 SkASSERT(glyph->fPath);
1367 blob->fBigGlyphs.push_back(BitmapTextBlob::BigGlyph(*glyph->fPath, x, y)); 1367 blob->fBigGlyphs.push_back(GrAtlasTextBlob::BigGlyph(*glyph->fPath, x, y));
1368 } 1368 }
1369 1369
1370 inline void GrAtlasTextContext::appendGlyphCommon(BitmapTextBlob* blob, Run* run , 1370 inline void GrAtlasTextContext::appendGlyphCommon(GrAtlasTextBlob* blob, Run* ru n,
1371 Run::SubRunInfo* subRun, 1371 Run::SubRunInfo* subRun,
1372 const SkRect& positions, GrCol or color, 1372 const SkRect& positions, GrCol or color,
1373 size_t vertexStride, bool useV ertexColor, 1373 size_t vertexStride, bool useV ertexColor,
1374 GrGlyph* glyph) { 1374 GrGlyph* glyph) {
1375 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; 1375 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph;
1376 run->fVertexBounds.joinNonEmptyArg(positions); 1376 run->fVertexBounds.joinNonEmptyArg(positions);
1377 run->fColor = color; 1377 run->fColor = color;
1378 1378
1379 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert exEndIndex); 1379 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert exEndIndex);
1380 1380
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1426 position->set(positions.fRight, positions.fTop); 1426 position->set(positions.fRight, positions.fTop);
1427 } 1427 }
1428 1428
1429 subRun->fGlyphEndIndex++; 1429 subRun->fGlyphEndIndex++;
1430 subRun->fVertexEndIndex += vertexStride * kVerticesPerGlyph; 1430 subRun->fVertexEndIndex += vertexStride * kVerticesPerGlyph;
1431 } 1431 }
1432 1432
1433 class BitmapTextBatch : public GrBatch { 1433 class BitmapTextBatch : public GrBatch {
1434 public: 1434 public:
1435 typedef GrAtlasTextContext::DistanceAdjustTable DistanceAdjustTable; 1435 typedef GrAtlasTextContext::DistanceAdjustTable DistanceAdjustTable;
1436 typedef GrAtlasTextContext::BitmapTextBlob Blob; 1436 typedef GrAtlasTextBlob Blob;
1437 typedef Blob::Run Run; 1437 typedef Blob::Run Run;
1438 typedef Run::SubRunInfo TextInfo; 1438 typedef Run::SubRunInfo TextInfo;
1439 struct Geometry { 1439 struct Geometry {
1440 Blob* fBlob; 1440 Blob* fBlob;
1441 int fRun; 1441 int fRun;
1442 int fSubRun; 1442 int fSubRun;
1443 GrColor fColor; 1443 GrColor fColor;
1444 SkScalar fTransX; 1444 SkScalar fTransX;
1445 SkScalar fTransY; 1445 SkScalar fTransY;
1446 }; 1446 };
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
2067 case SkTextBlob::kFull_Positioning: 2067 case SkTextBlob::kFull_Positioning:
2068 this->drawPosTextAsPath(rt, clip, runPaint, viewMatrix, 2068 this->drawPosTextAsPath(rt, clip, runPaint, viewMatrix,
2069 (const char*)it.glyphs(), 2069 (const char*)it.glyphs(),
2070 textLen, it.pos(), 2, SkPoint::Make(x, y), c lipBounds); 2070 textLen, it.pos(), 2, SkPoint::Make(x, y), c lipBounds);
2071 break; 2071 break;
2072 } 2072 }
2073 } 2073 }
2074 2074
2075 2075
2076 inline BitmapTextBatch* 2076 inline BitmapTextBatch*
2077 GrAtlasTextContext::createBatch(BitmapTextBlob* cacheBlob, const PerSubRunInfo& info, 2077 GrAtlasTextContext::createBatch(GrAtlasTextBlob* cacheBlob, const PerSubRunInfo& info,
2078 int glyphCount, int run, int subRun, 2078 int glyphCount, int run, int subRun,
2079 GrColor color, SkScalar transX, SkScalar transY, 2079 GrColor color, SkScalar transX, SkScalar transY,
2080 const SkPaint& skPaint) { 2080 const SkPaint& skPaint) {
2081 GrMaskFormat format = info.fMaskFormat; 2081 GrMaskFormat format = info.fMaskFormat;
2082 GrColor subRunColor; 2082 GrColor subRunColor;
2083 if (kARGB_GrMaskFormat == format) { 2083 if (kARGB_GrMaskFormat == format) {
2084 uint8_t paintAlpha = skPaint.getAlpha(); 2084 uint8_t paintAlpha = skPaint.getAlpha();
2085 subRunColor = SkColorSetARGB(paintAlpha, paintAlpha, paintAlpha, paintAl pha); 2085 subRunColor = SkColorSetARGB(paintAlpha, paintAlpha, paintAlpha, paintAl pha);
2086 } else { 2086 } else {
2087 subRunColor = color; 2087 subRunColor = color;
(...skipping 21 matching lines...) Expand all
2109 geometry.fSubRun = subRun; 2109 geometry.fSubRun = subRun;
2110 geometry.fColor = subRunColor; 2110 geometry.fColor = subRunColor;
2111 geometry.fTransX = transX; 2111 geometry.fTransX = transX;
2112 geometry.fTransY = transY; 2112 geometry.fTransY = transY;
2113 batch->init(); 2113 batch->init();
2114 2114
2115 return batch; 2115 return batch;
2116 } 2116 }
2117 2117
2118 inline void GrAtlasTextContext::flushRun(GrPipelineBuilder* pipelineBuilder, 2118 inline void GrAtlasTextContext::flushRun(GrPipelineBuilder* pipelineBuilder,
2119 BitmapTextBlob* cacheBlob, int run, GrC olor color, 2119 GrAtlasTextBlob* cacheBlob, int run, Gr Color color,
2120 SkScalar transX, SkScalar transY, 2120 SkScalar transX, SkScalar transY,
2121 const SkPaint& skPaint) { 2121 const SkPaint& skPaint) {
2122 for (int subRun = 0; subRun < cacheBlob->fRuns[run].fSubRunInfo.count(); sub Run++) { 2122 for (int subRun = 0; subRun < cacheBlob->fRuns[run].fSubRunInfo.count(); sub Run++) {
2123 const PerSubRunInfo& info = cacheBlob->fRuns[run].fSubRunInfo[subRun]; 2123 const PerSubRunInfo& info = cacheBlob->fRuns[run].fSubRunInfo[subRun];
2124 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex; 2124 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex;
2125 if (0 == glyphCount) { 2125 if (0 == glyphCount) {
2126 continue; 2126 continue;
2127 } 2127 }
2128 2128
2129 SkAutoTUnref<BitmapTextBatch> batch(this->createBatch(cacheBlob, info, g lyphCount, run, 2129 SkAutoTUnref<BitmapTextBatch> batch(this->createBatch(cacheBlob, info, g lyphCount, run,
2130 subRun, color, tra nsX, transY, 2130 subRun, color, tra nsX, transY,
2131 skPaint)); 2131 skPaint));
2132 fDrawContext->drawBatch(pipelineBuilder, batch); 2132 fDrawContext->drawBatch(pipelineBuilder, batch);
2133 } 2133 }
2134 } 2134 }
2135 2135
2136 inline void GrAtlasTextContext::flushBigGlyphs(BitmapTextBlob* cacheBlob, GrRend erTarget* rt, 2136 inline void GrAtlasTextContext::flushBigGlyphs(GrAtlasTextBlob* cacheBlob, GrRen derTarget* rt,
2137 const GrClip& clip, const SkPaint & skPaint, 2137 const GrClip& clip, const SkPaint & skPaint,
2138 SkScalar transX, SkScalar transY, 2138 SkScalar transX, SkScalar transY,
2139 const SkIRect& clipBounds) { 2139 const SkIRect& clipBounds) {
2140 if (!cacheBlob->fBigGlyphs.count()) { 2140 if (!cacheBlob->fBigGlyphs.count()) {
2141 return; 2141 return;
2142 } 2142 }
2143 2143
2144 SkMatrix pathMatrix; 2144 SkMatrix pathMatrix;
2145 if (!cacheBlob->fViewMatrix.invert(&pathMatrix)) { 2145 if (!cacheBlob->fViewMatrix.invert(&pathMatrix)) {
2146 SkDebugf("could not invert viewmatrix\n"); 2146 SkDebugf("could not invert viewmatrix\n");
2147 return; 2147 return;
2148 } 2148 }
2149 2149
2150 for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) { 2150 for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) {
2151 BitmapTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i]; 2151 GrAtlasTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i];
2152 bigGlyph.fVx += transX; 2152 bigGlyph.fVx += transX;
2153 bigGlyph.fVy += transY; 2153 bigGlyph.fVy += transY;
2154 SkMatrix translate = cacheBlob->fViewMatrix; 2154 SkMatrix translate = cacheBlob->fViewMatrix;
2155 translate.postTranslate(bigGlyph.fVx, bigGlyph.fVy); 2155 translate.postTranslate(bigGlyph.fVx, bigGlyph.fVy);
2156 2156
2157 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, rt, clip, bi gGlyph.fPath, 2157 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, rt, clip, bi gGlyph.fPath,
2158 skPaint, translate, &pathMatrix, cli pBounds, false); 2158 skPaint, translate, &pathMatrix, cli pBounds, false);
2159 } 2159 }
2160 } 2160 }
2161 2161
2162 void GrAtlasTextContext::flush(const SkTextBlob* blob, 2162 void GrAtlasTextContext::flush(const SkTextBlob* blob,
2163 BitmapTextBlob* cacheBlob, 2163 GrAtlasTextBlob* cacheBlob,
2164 GrRenderTarget* rt, 2164 GrRenderTarget* rt,
2165 const SkPaint& skPaint, 2165 const SkPaint& skPaint,
2166 const GrPaint& grPaint, 2166 const GrPaint& grPaint,
2167 SkDrawFilter* drawFilter, 2167 SkDrawFilter* drawFilter,
2168 const GrClip& clip, 2168 const GrClip& clip,
2169 const SkMatrix& viewMatrix, 2169 const SkMatrix& viewMatrix,
2170 const SkIRect& clipBounds, 2170 const SkIRect& clipBounds,
2171 SkScalar x, SkScalar y, 2171 SkScalar x, SkScalar y,
2172 SkScalar transX, SkScalar transY) { 2172 SkScalar transX, SkScalar transY) {
2173 // We loop through the runs of the blob, flushing each. If any run is too l arge, then we flush 2173 // We loop through the runs of the blob, flushing each. If any run is too l arge, then we flush
(...skipping 11 matching lines...) Expand all
2185 } 2185 }
2186 cacheBlob->fRuns[run].fVertexBounds.offset(transX, transY); 2186 cacheBlob->fRuns[run].fVertexBounds.offset(transX, transY);
2187 this->flushRun(&pipelineBuilder, cacheBlob, run, color, 2187 this->flushRun(&pipelineBuilder, cacheBlob, run, color,
2188 transX, transY, skPaint); 2188 transX, transY, skPaint);
2189 } 2189 }
2190 2190
2191 // Now flush big glyphs 2191 // Now flush big glyphs
2192 this->flushBigGlyphs(cacheBlob, rt, clip, skPaint, transX, transY, clipBound s); 2192 this->flushBigGlyphs(cacheBlob, rt, clip, skPaint, transX, transY, clipBound s);
2193 } 2193 }
2194 2194
2195 void GrAtlasTextContext::flush(BitmapTextBlob* cacheBlob, 2195 void GrAtlasTextContext::flush(GrAtlasTextBlob* cacheBlob,
2196 GrRenderTarget* rt, 2196 GrRenderTarget* rt,
2197 const SkPaint& skPaint, 2197 const SkPaint& skPaint,
2198 const GrPaint& grPaint, 2198 const GrPaint& grPaint,
2199 const GrClip& clip, 2199 const GrClip& clip,
2200 const SkIRect& clipBounds) { 2200 const SkIRect& clipBounds) {
2201 GrPipelineBuilder pipelineBuilder(grPaint, rt, clip); 2201 GrPipelineBuilder pipelineBuilder(grPaint, rt, clip);
2202 2202
2203 GrColor color = grPaint.getColor(); 2203 GrColor color = grPaint.getColor();
2204 for (int run = 0; run < cacheBlob->fRunCount; run++) { 2204 for (int run = 0; run < cacheBlob->fRunCount; run++) {
2205 this->flushRun(&pipelineBuilder, cacheBlob, run, color, 0, 0, skPaint); 2205 this->flushRun(&pipelineBuilder, cacheBlob, run, color, 0, 0, skPaint);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2258 2258
2259 const char* text = "The quick brown fox jumps over the lazy dog."; 2259 const char* text = "The quick brown fox jumps over the lazy dog.";
2260 int textLen = (int)strlen(text); 2260 int textLen = (int)strlen(text);
2261 2261
2262 // Setup clip 2262 // Setup clip
2263 GrClip clip; 2263 GrClip clip;
2264 SkIRect noClip = SkIRect::MakeLargest(); 2264 SkIRect noClip = SkIRect::MakeLargest();
2265 2265
2266 // right now we don't handle textblobs, nor do we handle drawPosText. Since we only 2266 // right now we don't handle textblobs, nor do we handle drawPosText. Since we only
2267 // intend to test the batch with this unit test, that is okay. 2267 // intend to test the batch with this unit test, that is okay.
2268 SkAutoTUnref<GrAtlasTextContext::BitmapTextBlob> blob( 2268 SkAutoTUnref<GrAtlasTextBlob> blob(
2269 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat rix, text, 2269 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat rix, text,
2270 static_cast<size_t>(textLen), 0, 0, noClip)); 2270 static_cast<size_t>(textLen), 0, 0, noClip));
2271 2271
2272 SkScalar transX = static_cast<SkScalar>(random->nextU()); 2272 SkScalar transX = static_cast<SkScalar>(random->nextU());
2273 SkScalar transY = static_cast<SkScalar>(random->nextU()); 2273 SkScalar transY = static_cast<SkScalar>(random->nextU());
2274 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun s[0].fSubRunInfo[0]; 2274 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0] ;
2275 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t ransY, skPaint); 2275 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t ransY, skPaint);
2276 } 2276 }
2277 2277
2278 #endif 2278 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | src/gpu/GrTextBlobCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698