OLD | NEW |
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 "GrBatchFontCache.h" | 9 #include "GrBatchFontCache.h" |
10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 if (this->canDrawAsDistanceFields(runPaint, viewMatrix)) { | 528 if (this->canDrawAsDistanceFields(runPaint, viewMatrix)) { |
529 cacheBlob->setHasDistanceField(); | 529 cacheBlob->setHasDistanceField(); |
530 SkPaint dfPaint = runPaint; | 530 SkPaint dfPaint = runPaint; |
531 SkScalar textRatio; | 531 SkScalar textRatio; |
532 this->initDistanceFieldPaint(cacheBlob, &dfPaint, &textRatio, viewMa
trix); | 532 this->initDistanceFieldPaint(cacheBlob, &dfPaint, &textRatio, viewMa
trix); |
533 Run& runIdx = cacheBlob->fRuns[run]; | 533 Run& runIdx = cacheBlob->fRuns[run]; |
534 PerSubRunInfo& subRun = runIdx.fSubRunInfo.back(); | 534 PerSubRunInfo& subRun = runIdx.fSubRunInfo.back(); |
535 subRun.fUseLCDText = runPaint.isLCDRenderText(); | 535 subRun.fUseLCDText = runPaint.isLCDRenderText(); |
536 subRun.fDrawAsDistanceFields = true; | 536 subRun.fDrawAsDistanceFields = true; |
537 | 537 |
538 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], dfPai
nt, nullptr, true); | |
539 | |
540 SkTDArray<char> fallbackTxt; | 538 SkTDArray<char> fallbackTxt; |
541 SkTDArray<SkScalar> fallbackPos; | 539 SkTDArray<SkScalar> fallbackPos; |
542 SkPoint dfOffset; | 540 SkPoint dfOffset; |
543 int scalarsPerPosition = 2; | 541 int scalarsPerPosition = 2; |
544 switch (it.positioning()) { | 542 switch (it.positioning()) { |
545 case SkTextBlob::kDefault_Positioning: { | 543 case SkTextBlob::kDefault_Positioning: { |
546 this->internalDrawDFText(cacheBlob, run, cache, dfPaint, col
or, viewMatrix, | 544 this->internalDrawDFText(cacheBlob, run, dfPaint, color, vie
wMatrix, |
547 (const char *)it.glyphs(), textLen, | 545 (const char *)it.glyphs(), textLen, |
548 x + offset.x(), y + offset.y(), cli
pRect, textRatio, | 546 x + offset.x(), y + offset.y(), cli
pRect, textRatio, |
549 &fallbackTxt, &fallbackPos, &dfOffs
et, runPaint); | 547 &fallbackTxt, &fallbackPos, &dfOffs
et, runPaint); |
550 break; | 548 break; |
551 } | 549 } |
552 case SkTextBlob::kHorizontal_Positioning: { | 550 case SkTextBlob::kHorizontal_Positioning: { |
553 scalarsPerPosition = 1; | 551 scalarsPerPosition = 1; |
554 dfOffset = SkPoint::Make(x, y + offset.y()); | 552 dfOffset = SkPoint::Make(x, y + offset.y()); |
555 this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint,
color, viewMatrix, | 553 this->internalDrawDFPosText(cacheBlob, run, dfPaint, color,
viewMatrix, |
556 (const char*)it.glyphs(), textLe
n, it.pos(), | 554 (const char*)it.glyphs(), textLe
n, it.pos(), |
557 scalarsPerPosition, dfOffset, cl
ipRect, textRatio, | 555 scalarsPerPosition, dfOffset, cl
ipRect, textRatio, |
558 &fallbackTxt, &fallbackPos); | 556 &fallbackTxt, &fallbackPos); |
559 break; | 557 break; |
560 } | 558 } |
561 case SkTextBlob::kFull_Positioning: { | 559 case SkTextBlob::kFull_Positioning: { |
562 dfOffset = SkPoint::Make(x, y); | 560 dfOffset = SkPoint::Make(x, y); |
563 this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint,
color, viewMatrix, | 561 this->internalDrawDFPosText(cacheBlob, run, dfPaint, color,
viewMatrix, |
564 (const char*)it.glyphs(), textLe
n, it.pos(), | 562 (const char*)it.glyphs(), textLe
n, it.pos(), |
565 scalarsPerPosition, dfOffset, cl
ipRect, textRatio, | 563 scalarsPerPosition, dfOffset, cl
ipRect, textRatio, |
566 &fallbackTxt, &fallbackPos); | 564 &fallbackTxt, &fallbackPos); |
567 break; | 565 break; |
568 } | 566 } |
569 } | 567 } |
570 if (fallbackTxt.count()) { | 568 if (fallbackTxt.count()) { |
571 this->fallbackDrawPosText(cacheBlob, run, rt, clip, color, runPa
int, viewMatrix, | 569 this->fallbackDrawPosText(cacheBlob, run, rt, clip, color, runPa
int, viewMatrix, |
572 fallbackTxt, fallbackPos, scalarsPerPo
sition, dfOffset, | 570 fallbackTxt, fallbackPos, scalarsPerPo
sition, dfOffset, |
573 clipRect); | 571 clipRect); |
574 } | 572 } |
575 | |
576 SkGlyphCache::AttachCache(cache); | |
577 } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { | 573 } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { |
578 cacheBlob->fRuns[run].fDrawAsPaths = true; | 574 cacheBlob->fRuns[run].fDrawAsPaths = true; |
579 } else { | 575 } else { |
580 cacheBlob->setHasBitmap(); | 576 cacheBlob->setHasBitmap(); |
581 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], runPa
int, &viewMatrix, | 577 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], runPa
int, &viewMatrix, |
582 false); | 578 false); |
583 switch (it.positioning()) { | 579 switch (it.positioning()) { |
584 case SkTextBlob::kDefault_Positioning: | 580 case SkTextBlob::kDefault_Positioning: |
585 this->internalDrawBMPText(cacheBlob, run, cache, runPaint, c
olor, viewMatrix, | 581 this->internalDrawBMPText(cacheBlob, run, cache, runPaint, c
olor, viewMatrix, |
586 (const char *)it.glyphs(), textLen
, | 582 (const char *)it.glyphs(), textLen
, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 fSurfaceProps, &viewMatrix, false); | 678 fSurfaceProps, &viewMatrix, false); |
683 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, | 679 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, |
684 run.fOverrideDescriptor->get
Desc()); | 680 run.fOverrideDescriptor->get
Desc()); |
685 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, color, viewMatr
ix, | 681 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, color, viewMatr
ix, |
686 fallbackTxt.begin(), fallbackTxt.count(), | 682 fallbackTxt.begin(), fallbackTxt.count(), |
687 fallbackPos.begin(), scalarsPerPosition, offset
, clipRect); | 683 fallbackPos.begin(), scalarsPerPosition, offset
, clipRect); |
688 SkGlyphCache::AttachCache(cache); | 684 SkGlyphCache::AttachCache(cache); |
689 } | 685 } |
690 | 686 |
691 inline GrAtlasTextBlob* | 687 inline GrAtlasTextBlob* |
692 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, | 688 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, |
693 const SkMatrix& viewMatrix, SkGlyphCache** cache
, | 689 const SkMatrix& viewMatrix, SkPaint* dfPaint, |
694 SkPaint* dfPaint, SkScalar* textRatio) { | 690 SkScalar* textRatio) { |
695 GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); | 691 GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); |
696 | 692 |
697 *dfPaint = origPaint; | 693 *dfPaint = origPaint; |
698 this->initDistanceFieldPaint(blob, dfPaint, textRatio, viewMatrix); | 694 this->initDistanceFieldPaint(blob, dfPaint, textRatio, viewMatrix); |
699 blob->fViewMatrix = viewMatrix; | 695 blob->fViewMatrix = viewMatrix; |
700 Run& run = blob->fRuns[0]; | 696 Run& run = blob->fRuns[0]; |
701 PerSubRunInfo& subRun = run.fSubRunInfo.back(); | 697 PerSubRunInfo& subRun = run.fSubRunInfo.back(); |
702 subRun.fUseLCDText = origPaint.isLCDRenderText(); | 698 subRun.fUseLCDText = origPaint.isLCDRenderText(); |
703 subRun.fDrawAsDistanceFields = true; | 699 subRun.fDrawAsDistanceFields = true; |
704 | 700 |
705 *cache = this->setupCache(&blob->fRuns[0], *dfPaint, nullptr, true); | |
706 return blob; | 701 return blob; |
707 } | 702 } |
708 | 703 |
709 inline GrAtlasTextBlob* | 704 inline GrAtlasTextBlob* |
710 GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, | 705 GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, |
711 const GrPaint& paint, const SkPaint& skPa
int, | 706 const GrPaint& paint, const SkPaint& skPa
int, |
712 const SkMatrix& viewMatrix, | 707 const SkMatrix& viewMatrix, |
713 const char text[], size_t byteLength, | 708 const char text[], size_t byteLength, |
714 SkScalar x, SkScalar y, const SkIRect& re
gionClipBounds) { | 709 SkScalar x, SkScalar y, const SkIRect& re
gionClipBounds) { |
715 int glyphCount = skPaint.countText(text, byteLength); | 710 int glyphCount = skPaint.countText(text, byteLength); |
716 SkIRect clipRect; | 711 SkIRect clipRect; |
717 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); | 712 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); |
718 | 713 |
719 GrAtlasTextBlob* blob; | 714 GrAtlasTextBlob* blob; |
720 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { | 715 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { |
721 SkPaint dfPaint; | 716 SkPaint dfPaint; |
722 SkScalar textRatio; | 717 SkScalar textRatio; |
723 SkGlyphCache* cache; | 718 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex
tRatio); |
724 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai
nt, &textRatio); | |
725 | 719 |
726 SkTDArray<char> fallbackTxt; | 720 SkTDArray<char> fallbackTxt; |
727 SkTDArray<SkScalar> fallbackPos; | 721 SkTDArray<SkScalar> fallbackPos; |
728 SkPoint offset; | 722 SkPoint offset; |
729 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view
Matrix, text, | 723 this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix,
text, |
730 byteLength, x, y, clipRect, textRatio, &fallbac
kTxt, &fallbackPos, | 724 byteLength, x, y, clipRect, textRatio, &fallbac
kTxt, &fallbackPos, |
731 &offset, skPaint); | 725 &offset, skPaint); |
732 SkGlyphCache::AttachCache(cache); | |
733 if (fallbackTxt.count()) { | 726 if (fallbackTxt.count()) { |
734 this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPai
nt, viewMatrix, | 727 this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPai
nt, viewMatrix, |
735 fallbackTxt, fallbackPos, 2, offset, clipR
ect); | 728 fallbackTxt, fallbackPos, 2, offset, clipR
ect); |
736 } | 729 } |
737 } else { | 730 } else { |
738 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); | 731 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); |
739 blob->fViewMatrix = viewMatrix; | 732 blob->fViewMatrix = viewMatrix; |
740 | 733 |
741 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa
trix, false); | 734 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa
trix, false); |
742 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie
wMatrix, text, | 735 this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), vie
wMatrix, text, |
(...skipping 12 matching lines...) Expand all Loading... |
755 const SkPoint& offset, const SkIRect&
regionClipBounds) { | 748 const SkPoint& offset, const SkIRect&
regionClipBounds) { |
756 int glyphCount = skPaint.countText(text, byteLength); | 749 int glyphCount = skPaint.countText(text, byteLength); |
757 | 750 |
758 SkIRect clipRect; | 751 SkIRect clipRect; |
759 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); | 752 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); |
760 | 753 |
761 GrAtlasTextBlob* blob; | 754 GrAtlasTextBlob* blob; |
762 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { | 755 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { |
763 SkPaint dfPaint; | 756 SkPaint dfPaint; |
764 SkScalar textRatio; | 757 SkScalar textRatio; |
765 SkGlyphCache* cache; | 758 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex
tRatio); |
766 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &cache, &dfPai
nt, &textRatio); | |
767 | 759 |
768 SkTDArray<char> fallbackTxt; | 760 SkTDArray<char> fallbackTxt; |
769 SkTDArray<SkScalar> fallbackPos; | 761 SkTDArray<SkScalar> fallbackPos; |
770 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v
iewMatrix, text, | 762 this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatr
ix, text, |
771 byteLength, pos, scalarsPerPosition, offset,
clipRect, | 763 byteLength, pos, scalarsPerPosition, offset,
clipRect, |
772 textRatio, &fallbackTxt, &fallbackPos); | 764 textRatio, &fallbackTxt, &fallbackPos); |
773 SkGlyphCache::AttachCache(cache); | |
774 if (fallbackTxt.count()) { | 765 if (fallbackTxt.count()) { |
775 this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPai
nt, viewMatrix, | 766 this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPai
nt, viewMatrix, |
776 fallbackTxt, fallbackPos, scalarsPerPositi
on, offset, | 767 fallbackTxt, fallbackPos, scalarsPerPositi
on, offset, |
777 clipRect); | 768 clipRect); |
778 } | 769 } |
779 } else { | 770 } else { |
780 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); | 771 blob = fCache->createBlob(glyphCount, 1, kGrayTextVASize); |
781 blob->fViewMatrix = viewMatrix; | 772 blob->fViewMatrix = viewMatrix; |
782 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa
trix, false); | 773 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa
trix, false); |
783 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(),
viewMatrix, text, | 774 this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(),
viewMatrix, text, |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 clipRect); | 1041 clipRect); |
1051 } | 1042 } |
1052 pos += scalarsPerPosition; | 1043 pos += scalarsPerPosition; |
1053 } | 1044 } |
1054 } | 1045 } |
1055 } | 1046 } |
1056 } | 1047 } |
1057 | 1048 |
1058 | 1049 |
1059 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, | 1050 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, |
1060 SkGlyphCache* cache, const SkPaint&
skPaint, | 1051 const SkPaint& skPaint, GrColor colo
r, |
1061 GrColor color, | |
1062 const SkMatrix& viewMatrix, | 1052 const SkMatrix& viewMatrix, |
1063 const char text[], size_t byteLength
, | 1053 const char text[], size_t byteLength
, |
1064 SkScalar x, SkScalar y, const SkIRec
t& clipRect, | 1054 SkScalar x, SkScalar y, const SkIRec
t& clipRect, |
1065 SkScalar textRatio, | 1055 SkScalar textRatio, |
1066 SkTDArray<char>* fallbackTxt, | 1056 SkTDArray<char>* fallbackTxt, |
1067 SkTDArray<SkScalar>* fallbackPos, | 1057 SkTDArray<SkScalar>* fallbackPos, |
1068 SkPoint* offset, | 1058 SkPoint* offset, |
1069 const SkPaint& origPaint) { | 1059 const SkPaint& origPaint) { |
1070 SkASSERT(byteLength == 0 || text != nullptr); | 1060 SkASSERT(byteLength == 0 || text != nullptr); |
1071 | 1061 |
1072 // nothing to draw | 1062 // nothing to draw |
1073 if (text == nullptr || byteLength == 0) { | 1063 if (text == nullptr || byteLength == 0) { |
1074 return; | 1064 return; |
1075 } | 1065 } |
1076 | 1066 |
1077 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); | 1067 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); |
1078 SkAutoDescriptor desc; | 1068 SkAutoDescriptor desc; |
1079 origPaint.getScalerContextDescriptor(&desc, fSurfaceProps, nullptr, true); | 1069 origPaint.getScalerContextDescriptor(&desc, fSurfaceProps, nullptr, true); |
1080 SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(origPaint.getTypefa
ce(), | 1070 SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(origPaint.getTypefa
ce(), |
1081 desc.getDesc()); | 1071 desc.getDesc()); |
1082 | 1072 |
1083 SkTArray<SkScalar> positions; | 1073 SkTArray<SkScalar> positions; |
1084 | 1074 |
1085 const char* textPtr = text; | 1075 const char* textPtr = text; |
1086 SkFixed stopX = 0; | 1076 SkFixed stopX = 0; |
1087 SkFixed stopY = 0; | 1077 SkFixed stopY = 0; |
1088 SkFixed origin = 0; | 1078 SkFixed origin = 0; |
1089 switch (origPaint.getTextAlign()) { | 1079 switch (origPaint.getTextAlign()) { |
1090 case SkPaint::kRight_Align: origin = SK_Fixed1; break; | 1080 case SkPaint::kRight_Align: origin = SK_Fixed1; break; |
(...skipping 12 matching lines...) Expand all Loading... |
1103 positions.push_back(SkFixedToScalar(stopX + SkFixedMul(origin, width))); | 1093 positions.push_back(SkFixedToScalar(stopX + SkFixedMul(origin, width))); |
1104 | 1094 |
1105 SkFixed height = glyph.fAdvanceY; | 1095 SkFixed height = glyph.fAdvanceY; |
1106 positions.push_back(SkFixedToScalar(stopY + SkFixedMul(origin, height)))
; | 1096 positions.push_back(SkFixedToScalar(stopY + SkFixedMul(origin, height)))
; |
1107 | 1097 |
1108 stopX += width; | 1098 stopX += width; |
1109 stopY += height; | 1099 stopY += height; |
1110 } | 1100 } |
1111 SkASSERT(textPtr == stop); | 1101 SkASSERT(textPtr == stop); |
1112 | 1102 |
| 1103 SkGlyphCache::AttachCache(origPaintCache); |
| 1104 |
1113 // now adjust starting point depending on alignment | 1105 // now adjust starting point depending on alignment |
1114 SkScalar alignX = SkFixedToScalar(stopX); | 1106 SkScalar alignX = SkFixedToScalar(stopX); |
1115 SkScalar alignY = SkFixedToScalar(stopY); | 1107 SkScalar alignY = SkFixedToScalar(stopY); |
1116 if (origPaint.getTextAlign() == SkPaint::kCenter_Align) { | 1108 if (origPaint.getTextAlign() == SkPaint::kCenter_Align) { |
1117 alignX = SkScalarHalf(alignX); | 1109 alignX = SkScalarHalf(alignX); |
1118 alignY = SkScalarHalf(alignY); | 1110 alignY = SkScalarHalf(alignY); |
1119 } else if (origPaint.getTextAlign() == SkPaint::kLeft_Align) { | 1111 } else if (origPaint.getTextAlign() == SkPaint::kLeft_Align) { |
1120 alignX = 0; | 1112 alignX = 0; |
1121 alignY = 0; | 1113 alignY = 0; |
1122 } | 1114 } |
1123 x -= alignX; | 1115 x -= alignX; |
1124 y -= alignY; | 1116 y -= alignY; |
1125 *offset = SkPoint::Make(x, y); | 1117 *offset = SkPoint::Make(x, y); |
1126 | 1118 |
1127 this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatri
x, text, byteLength, | 1119 this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text
, byteLength, |
1128 positions.begin(), 2, *offset, clipRect, textRat
io, fallbackTxt, | 1120 positions.begin(), 2, *offset, clipRect, textRat
io, fallbackTxt, |
1129 fallbackPos); | 1121 fallbackPos); |
1130 SkGlyphCache::AttachCache(origPaintCache); | |
1131 } | 1122 } |
1132 | 1123 |
1133 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
ex, | 1124 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
ex, |
1134 SkGlyphCache* cache, const SkPain
t& skPaint, | 1125 const SkPaint& skPaint, GrColor c
olor, |
1135 GrColor color, | |
1136 const SkMatrix& viewMatrix, | 1126 const SkMatrix& viewMatrix, |
1137 const char text[], size_t byteLen
gth, | 1127 const char text[], size_t byteLen
gth, |
1138 const SkScalar pos[], int scalars
PerPosition, | 1128 const SkScalar pos[], int scalars
PerPosition, |
1139 const SkPoint& offset, const SkIR
ect& clipRect, | 1129 const SkPoint& offset, const SkIR
ect& clipRect, |
1140 SkScalar textRatio, | 1130 SkScalar textRatio, |
1141 SkTDArray<char>* fallbackTxt, | 1131 SkTDArray<char>* fallbackTxt, |
1142 SkTDArray<SkScalar>* fallbackPos)
{ | 1132 SkTDArray<SkScalar>* fallbackPos)
{ |
1143 | 1133 |
1144 SkASSERT(byteLength == 0 || text != nullptr); | 1134 SkASSERT(byteLength == 0 || text != nullptr); |
1145 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); | 1135 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
1146 | 1136 |
1147 // nothing to draw | 1137 // nothing to draw |
1148 if (text == nullptr || byteLength == 0) { | 1138 if (text == nullptr || byteLength == 0) { |
1149 return; | 1139 return; |
1150 } | 1140 } |
1151 | 1141 |
1152 fCurrStrike = nullptr; | 1142 fCurrStrike = nullptr; |
1153 | 1143 |
1154 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); | 1144 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); |
| 1145 SkGlyphCache* cache = this->setupCache(&blob->fRuns[runIndex], skPaint, null
ptr, true); |
1155 GrFontScaler* fontScaler = GetGrFontScaler(cache); | 1146 GrFontScaler* fontScaler = GetGrFontScaler(cache); |
1156 | 1147 |
1157 const char* stop = text + byteLength; | 1148 const char* stop = text + byteLength; |
1158 | 1149 |
1159 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { | 1150 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { |
1160 while (text < stop) { | 1151 while (text < stop) { |
1161 const char* lastText = text; | 1152 const char* lastText = text; |
1162 // the last 2 parameters are ignored | 1153 // the last 2 parameters are ignored |
1163 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1154 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1164 | 1155 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 fallbackTxt->append(SkToInt(text-lastText), lastText); | 1199 fallbackTxt->append(SkToInt(text-lastText), lastText); |
1209 *fallbackPos->append() = pos[0]; | 1200 *fallbackPos->append() = pos[0]; |
1210 if (2 == scalarsPerPosition) { | 1201 if (2 == scalarsPerPosition) { |
1211 *fallbackPos->append() = pos[1]; | 1202 *fallbackPos->append() = pos[1]; |
1212 } | 1203 } |
1213 } | 1204 } |
1214 } | 1205 } |
1215 pos += scalarsPerPosition; | 1206 pos += scalarsPerPosition; |
1216 } | 1207 } |
1217 } | 1208 } |
| 1209 |
| 1210 SkGlyphCache::AttachCache(cache); |
1218 } | 1211 } |
1219 | 1212 |
1220 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, | 1213 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
1221 const SkGlyph& skGlyph, | 1214 const SkGlyph& skGlyph, |
1222 int vx, int vy, GrColor color, GrFontSca
ler* scaler, | 1215 int vx, int vy, GrColor color, GrFontSca
ler* scaler, |
1223 const SkIRect& clipRect) { | 1216 const SkIRect& clipRect) { |
1224 Run& run = blob->fRuns[runIndex]; | 1217 Run& run = blob->fRuns[runIndex]; |
1225 if (!fCurrStrike) { | 1218 if (!fCurrStrike) { |
1226 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 1219 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
1227 } | 1220 } |
(...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2286 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2279 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
2287 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2280 static_cast<size_t>(textLen), 0, 0,
noClip)); |
2288 | 2281 |
2289 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2282 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
2290 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2283 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
2291 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; | 2284 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; |
2292 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2285 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
2293 } | 2286 } |
2294 | 2287 |
2295 #endif | 2288 #endif |
OLD | NEW |