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 "GrAtlas.h" | 9 #include "GrAtlas.h" |
10 #include "GrBatch.h" | 10 #include "GrBatch.h" |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 | 361 |
362 if (glyph.fWidth) { | 362 if (glyph.fWidth) { |
363 this->appendGlyph(blob, | 363 this->appendGlyph(blob, |
364 runIndex, | 364 runIndex, |
365 GrGlyph::Pack(glyph.getGlyphID(), | 365 GrGlyph::Pack(glyph.getGlyphID(), |
366 glyph.getSubXFixed(), | 366 glyph.getSubXFixed(), |
367 glyph.getSubYFixed(), | 367 glyph.getSubYFixed(), |
368 GrGlyph::kCoverage_MaskStyle), | 368 GrGlyph::kCoverage_MaskStyle), |
369 Sk48Dot16FloorToInt(fx), | 369 Sk48Dot16FloorToInt(fx), |
370 Sk48Dot16FloorToInt(fy), | 370 Sk48Dot16FloorToInt(fy), |
| 371 skPaint.getColor(), |
371 fontScaler, | 372 fontScaler, |
372 clipRect); | 373 clipRect); |
373 } | 374 } |
374 | 375 |
375 fx += glyph.fAdvanceX; | 376 fx += glyph.fAdvanceX; |
376 fy += glyph.fAdvanceY; | 377 fy += glyph.fAdvanceY; |
377 } | 378 } |
378 } | 379 } |
379 | 380 |
380 void GrAtlasTextContext::onDrawPosText(GrRenderTarget* rt, const GrClip& clip, | 381 void GrAtlasTextContext::onDrawPosText(GrRenderTarget* rt, const GrClip& clip, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 | 453 |
453 if (glyph.fWidth) { | 454 if (glyph.fWidth) { |
454 this->appendGlyph(blob, | 455 this->appendGlyph(blob, |
455 runIndex, | 456 runIndex, |
456 GrGlyph::Pack(glyph.getGlyphID(), | 457 GrGlyph::Pack(glyph.getGlyphID(), |
457 glyph.getSubXFixed(), | 458 glyph.getSubXFixed(), |
458 glyph.getSubYFixed(), | 459 glyph.getSubYFixed(), |
459 GrGlyph::kCoverage_MaskStyle
), | 460 GrGlyph::kCoverage_MaskStyle
), |
460 Sk48Dot16FloorToInt(fx), | 461 Sk48Dot16FloorToInt(fx), |
461 Sk48Dot16FloorToInt(fy), | 462 Sk48Dot16FloorToInt(fy), |
| 463 skPaint.getColor(), |
462 fontScaler, | 464 fontScaler, |
463 clipRect); | 465 clipRect); |
464 } | 466 } |
465 pos += scalarsPerPosition; | 467 pos += scalarsPerPosition; |
466 } | 468 } |
467 } else { | 469 } else { |
468 while (text < stop) { | 470 while (text < stop) { |
469 const char* currentText = text; | 471 const char* currentText = text; |
470 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0); | 472 const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0); |
471 | 473 |
(...skipping 17 matching lines...) Expand all Loading... |
489 SkASSERT(glyph.fWidth); | 491 SkASSERT(glyph.fWidth); |
490 | 492 |
491 this->appendGlyph(blob, | 493 this->appendGlyph(blob, |
492 runIndex, | 494 runIndex, |
493 GrGlyph::Pack(glyph.getGlyphID(), | 495 GrGlyph::Pack(glyph.getGlyphID(), |
494 glyph.getSubXFixed(), | 496 glyph.getSubXFixed(), |
495 glyph.getSubYFixed(), | 497 glyph.getSubYFixed(), |
496 GrGlyph::kCoverage_MaskStyle
), | 498 GrGlyph::kCoverage_MaskStyle
), |
497 Sk48Dot16FloorToInt(fx), | 499 Sk48Dot16FloorToInt(fx), |
498 Sk48Dot16FloorToInt(fy), | 500 Sk48Dot16FloorToInt(fy), |
| 501 skPaint.getColor(), |
499 fontScaler, | 502 fontScaler, |
500 clipRect); | 503 clipRect); |
501 } | 504 } |
502 pos += scalarsPerPosition; | 505 pos += scalarsPerPosition; |
503 } | 506 } |
504 } | 507 } |
505 } else { // not subpixel | 508 } else { // not subpixel |
506 | 509 |
507 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { | 510 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { |
508 while (text < stop) { | 511 while (text < stop) { |
509 // the last 2 parameters are ignored | 512 // the last 2 parameters are ignored |
510 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 513 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
511 | 514 |
512 if (glyph.fWidth) { | 515 if (glyph.fWidth) { |
513 SkPoint tmsLoc; | 516 SkPoint tmsLoc; |
514 tmsProc(pos, &tmsLoc); | 517 tmsProc(pos, &tmsLoc); |
515 | 518 |
516 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf);
//halfSampleX; | 519 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf);
//halfSampleX; |
517 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf);
//halfSampleY; | 520 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf);
//halfSampleY; |
518 this->appendGlyph(blob, | 521 this->appendGlyph(blob, |
519 runIndex, | 522 runIndex, |
520 GrGlyph::Pack(glyph.getGlyphID(), | 523 GrGlyph::Pack(glyph.getGlyphID(), |
521 glyph.getSubXFixed(), | 524 glyph.getSubXFixed(), |
522 glyph.getSubYFixed(), | 525 glyph.getSubYFixed(), |
523 GrGlyph::kCoverage_MaskStyle
), | 526 GrGlyph::kCoverage_MaskStyle
), |
524 Sk48Dot16FloorToInt(fx), | 527 Sk48Dot16FloorToInt(fx), |
525 Sk48Dot16FloorToInt(fy), | 528 Sk48Dot16FloorToInt(fy), |
| 529 skPaint.getColor(), |
526 fontScaler, | 530 fontScaler, |
527 clipRect); | 531 clipRect); |
528 } | 532 } |
529 pos += scalarsPerPosition; | 533 pos += scalarsPerPosition; |
530 } | 534 } |
531 } else { | 535 } else { |
532 while (text < stop) { | 536 while (text < stop) { |
533 // the last 2 parameters are ignored | 537 // the last 2 parameters are ignored |
534 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 538 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
535 | 539 |
536 if (glyph.fWidth) { | 540 if (glyph.fWidth) { |
537 SkPoint tmsLoc; | 541 SkPoint tmsLoc; |
538 tmsProc(pos, &tmsLoc); | 542 tmsProc(pos, &tmsLoc); |
539 | 543 |
540 SkPoint alignLoc; | 544 SkPoint alignLoc; |
541 alignProc(tmsLoc, glyph, &alignLoc); | 545 alignProc(tmsLoc, glyph, &alignLoc); |
542 | 546 |
543 Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf
); //halfSampleX; | 547 Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf
); //halfSampleX; |
544 Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf
); //halfSampleY; | 548 Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf
); //halfSampleY; |
545 this->appendGlyph(blob, | 549 this->appendGlyph(blob, |
546 runIndex, | 550 runIndex, |
547 GrGlyph::Pack(glyph.getGlyphID(), | 551 GrGlyph::Pack(glyph.getGlyphID(), |
548 glyph.getSubXFixed(), | 552 glyph.getSubXFixed(), |
549 glyph.getSubYFixed(), | 553 glyph.getSubYFixed(), |
550 GrGlyph::kCoverage_MaskStyle
), | 554 GrGlyph::kCoverage_MaskStyle
), |
551 Sk48Dot16FloorToInt(fx), | 555 Sk48Dot16FloorToInt(fx), |
552 Sk48Dot16FloorToInt(fy), | 556 Sk48Dot16FloorToInt(fy), |
| 557 skPaint.getColor(), |
553 fontScaler, | 558 fontScaler, |
554 clipRect); | 559 clipRect); |
555 } | 560 } |
556 pos += scalarsPerPosition; | 561 pos += scalarsPerPosition; |
557 } | 562 } |
558 } | 563 } |
559 } | 564 } |
560 } | 565 } |
561 | 566 |
562 void GrAtlasTextContext::appendGlyph(BitmapTextBlob* blob, int runIndex, GrGlyph
::PackedID packed, | 567 void GrAtlasTextContext::appendGlyph(BitmapTextBlob* blob, int runIndex, GrGlyph
::PackedID packed, |
563 int vx, int vy, GrFontScaler* scaler, | 568 int vx, int vy, GrColor color, GrFontScaler
* scaler, |
564 const SkIRect& clipRect) { | 569 const SkIRect& clipRect) { |
565 if (NULL == fCurrStrike) { | 570 if (NULL == fCurrStrike) { |
566 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 571 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
567 } | 572 } |
568 | 573 |
569 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); | 574 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); |
570 if (NULL == glyph || glyph->fBounds.isEmpty()) { | 575 if (NULL == glyph || glyph->fBounds.isEmpty()) { |
571 return; | 576 return; |
572 } | 577 } |
573 | 578 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 | 626 |
622 size_t vertexStride = get_vertex_stride(format); | 627 size_t vertexStride = get_vertex_stride(format); |
623 | 628 |
624 SkRect r; | 629 SkRect r; |
625 r.fLeft = SkIntToScalar(x); | 630 r.fLeft = SkIntToScalar(x); |
626 r.fTop = SkIntToScalar(y); | 631 r.fTop = SkIntToScalar(y); |
627 r.fRight = r.fLeft + SkIntToScalar(width); | 632 r.fRight = r.fLeft + SkIntToScalar(width); |
628 r.fBottom = r.fTop + SkIntToScalar(height); | 633 r.fBottom = r.fTop + SkIntToScalar(height); |
629 | 634 |
630 run.fVertexBounds.joinNonEmptyArg(r); | 635 run.fVertexBounds.joinNonEmptyArg(r); |
631 GrColor color = fPaint.getColor(); | |
632 run.fColor = color; | 636 run.fColor = color; |
633 | 637 |
634 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert
exEndIndex); | 638 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert
exEndIndex); |
635 | 639 |
636 // V0 | 640 // V0 |
637 SkPoint* position = reinterpret_cast<SkPoint*>(vertex); | 641 SkPoint* position = reinterpret_cast<SkPoint*>(vertex); |
638 position->set(r.fLeft, r.fTop); | 642 position->set(r.fLeft, r.fTop); |
639 if (kA8_GrMaskFormat == format) { | 643 if (kA8_GrMaskFormat == format) { |
640 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; | 644 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; |
641 *colorPtr = color; | 645 *colorPtr = color; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline
) override { | 742 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline
) override { |
739 // if we have RGB, then we won't have any SkShaders so no need to use a
localmatrix. | 743 // if we have RGB, then we won't have any SkShaders so no need to use a
localmatrix. |
740 // TODO actually only invert if we don't have RGBA | 744 // TODO actually only invert if we don't have RGBA |
741 SkMatrix localMatrix; | 745 SkMatrix localMatrix; |
742 if (this->usesLocalCoords() && !this->viewMatrix().invert(&localMatrix))
{ | 746 if (this->usesLocalCoords() && !this->viewMatrix().invert(&localMatrix))
{ |
743 SkDebugf("Cannot invert viewmatrix\n"); | 747 SkDebugf("Cannot invert viewmatrix\n"); |
744 return; | 748 return; |
745 } | 749 } |
746 | 750 |
747 GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::kNone
_FilterMode); | 751 GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::kNone
_FilterMode); |
| 752 |
748 // This will be ignored in the non A8 case | 753 // This will be ignored in the non A8 case |
749 bool opaqueVertexColors = GrColorIsOpaque(this->color()); | 754 bool opaqueVertexColors = GrColorIsOpaque(this->color()); |
750 SkAutoTUnref<const GrGeometryProcessor> gp( | 755 SkAutoTUnref<const GrGeometryProcessor> gp( |
751 GrBitmapTextGeoProc::Create(this->color(), | 756 GrBitmapTextGeoProc::Create(this->color(), |
752 fFontCache->getTexture(fMaskFormat), | 757 fFontCache->getTexture(fMaskFormat), |
753 params, | 758 params, |
754 fMaskFormat, | 759 fMaskFormat, |
755 opaqueVertexColors, | 760 opaqueVertexColors, |
756 localMatrix)); | 761 localMatrix)); |
757 | 762 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 GrColor color = paint.getColor(); | 1024 GrColor color = paint.getColor(); |
1020 for (uint32_t run = 0; run < blob->fRunCount; run++) { | 1025 for (uint32_t run = 0; run < blob->fRunCount; run++) { |
1021 for (int subRun = 0; subRun < blob->fRuns[run].fSubRunInfo.count(); subR
un++) { | 1026 for (int subRun = 0; subRun < blob->fRuns[run].fSubRunInfo.count(); subR
un++) { |
1022 PerSubRunInfo& info = blob->fRuns[run].fSubRunInfo[subRun]; | 1027 PerSubRunInfo& info = blob->fRuns[run].fSubRunInfo[subRun]; |
1023 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex; | 1028 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex; |
1024 if (0 == glyphCount) { | 1029 if (0 == glyphCount) { |
1025 continue; | 1030 continue; |
1026 } | 1031 } |
1027 | 1032 |
1028 GrMaskFormat format = info.fMaskFormat; | 1033 GrMaskFormat format = info.fMaskFormat; |
1029 if (kARGB_GrMaskFormat == format) { | 1034 GrColor subRunColor = kARGB_GrMaskFormat == format ? |
1030 color = SkColorSetARGB(paintAlpha, paintAlpha, paintAlpha, paint
Alpha); | 1035 SkColorSetARGB(paintAlpha, paintAlpha, paintAl
pha, paintAlpha) : |
1031 } | 1036 color; |
1032 | 1037 |
1033 BitmapTextBatch::Geometry geometry; | 1038 BitmapTextBatch::Geometry geometry; |
1034 geometry.fBlob.reset(SkRef(blob)); | 1039 geometry.fBlob.reset(SkRef(blob)); |
1035 geometry.fRun = run; | 1040 geometry.fRun = run; |
1036 geometry.fSubRun = subRun; | 1041 geometry.fSubRun = subRun; |
1037 geometry.fColor = color; | 1042 geometry.fColor = color; |
1038 SkAutoTUnref<GrBatch> batch(BitmapTextBatch::Create(geometry, color,
format, glyphCount, | 1043 SkAutoTUnref<GrBatch> batch(BitmapTextBatch::Create(geometry, subRun
Color, format, |
| 1044 glyphCount, |
1039 fContext->getBat
chFontCache())); | 1045 fContext->getBat
chFontCache())); |
1040 | 1046 |
1041 target->drawBatch(&pipelineBuilder, batch, &blob->fRuns[run].fVertex
Bounds); | 1047 target->drawBatch(&pipelineBuilder, batch, &blob->fRuns[run].fVertex
Bounds); |
1042 } | 1048 } |
1043 } | 1049 } |
1044 | 1050 |
1045 // Now flush big glyphs | 1051 // Now flush big glyphs |
1046 for (int i = 0; i < blob->fBigGlyphs.count(); i++) { | 1052 for (int i = 0; i < blob->fBigGlyphs.count(); i++) { |
1047 BitmapTextBlob::BigGlyph& bigGlyph = blob->fBigGlyphs[i]; | 1053 BitmapTextBlob::BigGlyph& bigGlyph = blob->fBigGlyphs[i]; |
1048 SkMatrix translate; | 1054 SkMatrix translate; |
1049 translate.setTranslate(SkIntToScalar(bigGlyph.fVx), SkIntToScalar(bigGly
ph.fVy)); | 1055 translate.setTranslate(SkIntToScalar(bigGlyph.fVx), SkIntToScalar(bigGly
ph.fVy)); |
1050 SkPath tmpPath(bigGlyph.fPath); | 1056 SkPath tmpPath(bigGlyph.fPath); |
1051 tmpPath.transform(translate); | 1057 tmpPath.transform(translate); |
1052 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); | 1058 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); |
1053 fContext->drawPath(rt, clip, paint, SkMatrix::I(), tmpPath, strokeInfo); | 1059 fContext->drawPath(rt, clip, paint, SkMatrix::I(), tmpPath, strokeInfo); |
1054 } | 1060 } |
1055 } | 1061 } |
OLD | NEW |