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

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

Issue 1519083002: A change to cleanup some organization around df text (Closed) Base URL: https://skia.googlesource.com/skia.git@cleanuptext12textutilsdftext
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/text/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 "GrDrawContext.h" 9 #include "GrDrawContext.h"
10 #include "GrDrawTarget.h" 10 #include "GrDrawTarget.h"
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 284
285 if (this->canDrawAsDistanceFields(runPaint, viewMatrix)) { 285 if (this->canDrawAsDistanceFields(runPaint, viewMatrix)) {
286 cacheBlob->setHasDistanceField(); 286 cacheBlob->setHasDistanceField();
287 SkPaint dfPaint = runPaint; 287 SkPaint dfPaint = runPaint;
288 SkScalar textRatio; 288 SkScalar textRatio;
289 this->initDistanceFieldPaint(cacheBlob, &dfPaint, &textRatio, viewMa trix); 289 this->initDistanceFieldPaint(cacheBlob, &dfPaint, &textRatio, viewMa trix);
290 Run& runIdx = cacheBlob->fRuns[run]; 290 Run& runIdx = cacheBlob->fRuns[run];
291 PerSubRunInfo& subRun = runIdx.fSubRunInfo.back(); 291 PerSubRunInfo& subRun = runIdx.fSubRunInfo.back();
292 subRun.setUseLCDText(runPaint.isLCDRenderText()); 292 subRun.setUseLCDText(runPaint.isLCDRenderText());
293 subRun.setDrawAsDistanceFields(); 293 subRun.setDrawAsDistanceFields();
294 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], dfPai nt, nullptr, true);
294 295
295 SkTDArray<char> fallbackTxt;
296 SkTDArray<SkScalar> fallbackPos;
297 SkPoint dfOffset;
298 int scalarsPerPosition = 2;
299 switch (it.positioning()) { 296 switch (it.positioning()) {
300 case SkTextBlob::kDefault_Positioning: { 297 case SkTextBlob::kDefault_Positioning: {
301 this->internalDrawDFText(cacheBlob, run, dfPaint, color, vie wMatrix, 298 this->internalDrawDFText(cacheBlob, run, cache, dfPaint, col or, viewMatrix,
302 (const char *)it.glyphs(), textLen, 299 (const char *)it.glyphs(), textLen,
303 x + offset.x(), y + offset.y(), tex tRatio, 300 x + offset.x(), y + offset.y(), tex tRatio, runPaint);
304 &fallbackTxt, &fallbackPos, &dfOffs et, runPaint);
305 break; 301 break;
306 } 302 }
307 case SkTextBlob::kHorizontal_Positioning: { 303 case SkTextBlob::kHorizontal_Positioning: {
308 scalarsPerPosition = 1; 304 SkPoint dfOffset = SkPoint::Make(x, y + offset.y());
309 dfOffset = SkPoint::Make(x, y + offset.y()); 305 this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
310 this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix,
311 (const char*)it.glyphs(), textLe n, it.pos(), 306 (const char*)it.glyphs(), textLe n, it.pos(),
312 scalarsPerPosition, dfOffset, te xtRatio, 307 1, dfOffset, textRatio,
313 &fallbackTxt, &fallbackPos); 308 runPaint);
314 break; 309 break;
315 } 310 }
316 case SkTextBlob::kFull_Positioning: { 311 case SkTextBlob::kFull_Positioning: {
317 dfOffset = SkPoint::Make(x, y); 312 SkPoint dfOffset = SkPoint::Make(x, y);
318 this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, 313 this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
319 (const char*)it.glyphs(), textLe n, it.pos(), 314 (const char*)it.glyphs(), textLe n, it.pos(),
320 scalarsPerPosition, dfOffset, te xtRatio, 315 2, dfOffset, textRatio, runPaint );
321 &fallbackTxt, &fallbackPos);
322 break; 316 break;
323 } 317 }
324 } 318 }
325 if (fallbackTxt.count()) { 319 SkGlyphCache::AttachCache(cache);
326 this->fallbackDrawPosText(cacheBlob, run, clip, color, runPaint, viewMatrix,
327 fallbackTxt, fallbackPos, scalarsPerPo sition, dfOffset);
328 }
329 } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { 320 } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) {
330 cacheBlob->fRuns[run].fDrawAsPaths = true; 321 cacheBlob->fRuns[run].fDrawAsPaths = true;
331 } else { 322 } else {
332 cacheBlob->setHasBitmap(); 323 cacheBlob->setHasBitmap();
333 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], runPa int, &viewMatrix, 324 SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], runPa int, &viewMatrix,
334 false); 325 false);
335 switch (it.positioning()) { 326 switch (it.positioning()) {
336 case SkTextBlob::kDefault_Positioning: 327 case SkTextBlob::kDefault_Positioning:
337 GrTextUtils::DrawBmpText(cacheBlob, run, fContext->getBatchF ontCache(), 328 GrTextUtils::DrawBmpText(cacheBlob, run, fContext->getBatchF ontCache(),
338 cache, runPaint, color, viewMatrix, 329 cache, runPaint, color, viewMatrix,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 blob->fMinMaxScale = SkMinScalar(dfMaskScaleCeil / scaledTextSize, blob->fMi nMaxScale); 402 blob->fMinMaxScale = SkMinScalar(dfMaskScaleCeil / scaledTextSize, blob->fMi nMaxScale);
412 403
413 skPaint->setLCDRenderText(false); 404 skPaint->setLCDRenderText(false);
414 skPaint->setAutohinted(false); 405 skPaint->setAutohinted(false);
415 skPaint->setHinting(SkPaint::kNormal_Hinting); 406 skPaint->setHinting(SkPaint::kNormal_Hinting);
416 skPaint->setSubpixelText(true); 407 skPaint->setSubpixelText(true);
417 } 408 }
418 409
419 inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, 410 inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob,
420 int runIndex, 411 int runIndex,
421 const GrClip& clip,
422 GrColor color, 412 GrColor color,
423 const SkPaint& skPaint, 413 const SkPaint& skPaint,
424 const SkMatrix& viewMatrix, 414 const SkMatrix& viewMatrix,
425 const SkTDArray<char>& fallb ackTxt, 415 const SkTDArray<char>& fallb ackTxt,
426 const SkTDArray<SkScalar>& f allbackPos, 416 const SkTDArray<SkScalar>& f allbackPos,
427 int scalarsPerPosition, 417 int scalarsPerPosition,
428 const SkPoint& offset) { 418 const SkPoint& offset) {
429 SkASSERT(fallbackTxt.count()); 419 SkASSERT(fallbackTxt.count());
430 blob->setHasBitmap(); 420 blob->setHasBitmap();
431 Run& run = blob->fRuns[runIndex]; 421 Run& run = blob->fRuns[runIndex];
(...skipping 21 matching lines...) Expand all
453 blob->fViewMatrix = viewMatrix; 443 blob->fViewMatrix = viewMatrix;
454 Run& run = blob->fRuns[0]; 444 Run& run = blob->fRuns[0];
455 PerSubRunInfo& subRun = run.fSubRunInfo.back(); 445 PerSubRunInfo& subRun = run.fSubRunInfo.back();
456 subRun.setUseLCDText(origPaint.isLCDRenderText()); 446 subRun.setUseLCDText(origPaint.isLCDRenderText());
457 subRun.setDrawAsDistanceFields(); 447 subRun.setDrawAsDistanceFields();
458 448
459 return blob; 449 return blob;
460 } 450 }
461 451
462 inline GrAtlasTextBlob* 452 inline GrAtlasTextBlob*
463 GrAtlasTextContext::createDrawTextBlob(const GrClip& clip, 453 GrAtlasTextContext::createDrawTextBlob(const GrPaint& paint, const SkPaint& skPa int,
464 const GrPaint& paint, const SkPaint& skPa int,
465 const SkMatrix& viewMatrix, 454 const SkMatrix& viewMatrix,
466 const char text[], size_t byteLength, 455 const char text[], size_t byteLength,
467 SkScalar x, SkScalar y, const SkIRect& re gionClipBounds) { 456 SkScalar x, SkScalar y) {
468 int glyphCount = skPaint.countText(text, byteLength); 457 int glyphCount = skPaint.countText(text, byteLength);
469 458
470 GrAtlasTextBlob* blob; 459 GrAtlasTextBlob* blob;
471 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { 460 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) {
472 SkPaint dfPaint; 461 SkPaint dfPaint;
473 SkScalar textRatio; 462 SkScalar textRatio;
474 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex tRatio); 463 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex tRatio);
464 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr , true);
475 465
476 SkTDArray<char> fallbackTxt; 466 this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), view Matrix, text,
477 SkTDArray<SkScalar> fallbackPos; 467 byteLength, x, y, textRatio, skPaint);
478 SkPoint offset; 468 SkGlyphCache::AttachCache(cache);
479 this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text,
480 byteLength, x, y, textRatio, &fallbackTxt, &fal lbackPos,
481 &offset, skPaint);
482 if (fallbackTxt.count()) {
483 this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
484 fallbackTxt, fallbackPos, 2, offset);
485 }
486 } else { 469 } else {
487 blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASiz e); 470 blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASiz e);
488 blob->fViewMatrix = viewMatrix; 471 blob->fViewMatrix = viewMatrix;
489 472
490 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false); 473 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false);
491 GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), cache, skPaint, 474 GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), cache, skPaint,
492 paint.getColor(), viewMatrix, text, byteLength, x, y); 475 paint.getColor(), viewMatrix, text, byteLength, x, y);
493 SkGlyphCache::AttachCache(cache); 476 SkGlyphCache::AttachCache(cache);
494 } 477 }
495 return blob; 478 return blob;
496 } 479 }
497 480
498 inline GrAtlasTextBlob* 481 inline GrAtlasTextBlob*
499 GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip, 482 GrAtlasTextContext::createDrawPosTextBlob(const GrPaint& paint, const SkPaint& s kPaint,
500 const GrPaint& paint, const SkPaint& s kPaint,
501 const SkMatrix& viewMatrix, 483 const SkMatrix& viewMatrix,
502 const char text[], size_t byteLength, 484 const char text[], size_t byteLength,
503 const SkScalar pos[], int scalarsPerPo sition, 485 const SkScalar pos[], int scalarsPerPo sition,
504 const SkPoint& offset, const SkIRect& regionClipBounds) { 486 const SkPoint& offset) {
505 int glyphCount = skPaint.countText(text, byteLength); 487 int glyphCount = skPaint.countText(text, byteLength);
506 488
507 GrAtlasTextBlob* blob; 489 GrAtlasTextBlob* blob;
508 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { 490 if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) {
509 SkPaint dfPaint; 491 SkPaint dfPaint;
510 SkScalar textRatio; 492 SkScalar textRatio;
511 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex tRatio); 493 blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &tex tRatio);
494 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr , true);
512 495
513 SkTDArray<char> fallbackTxt; 496 this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), v iewMatrix, text,
514 SkTDArray<SkScalar> fallbackPos; 497 byteLength, pos, scalarsPerPosition, offset, textRatio,
515 this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatr ix, text, 498 skPaint);
516 byteLength, pos, scalarsPerPosition, offset, 499 SkGlyphCache::AttachCache(cache);
517 textRatio, &fallbackTxt, &fallbackPos);
518 if (fallbackTxt.count()) {
519 this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
520 fallbackTxt, fallbackPos, scalarsPerPositi on, offset);
521 }
522 } else { 500 } else {
523 blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASiz e); 501 blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASiz e);
524 blob->fViewMatrix = viewMatrix; 502 blob->fViewMatrix = viewMatrix;
525 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false); 503 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMa trix, false);
526 GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), cach e, skPaint, 504 GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), cach e, skPaint,
527 paint.getColor(), viewMatrix, text, 505 paint.getColor(), viewMatrix, text,
528 byteLength, pos, scalarsPerPosition, offset) ; 506 byteLength, pos, scalarsPerPosition, offset) ;
529 SkGlyphCache::AttachCache(cache); 507 SkGlyphCache::AttachCache(cache);
530 } 508 }
531 return blob; 509 return blob;
532 } 510 }
533 511
534 void GrAtlasTextContext::onDrawText(GrDrawContext* dc, 512 void GrAtlasTextContext::onDrawText(GrDrawContext* dc,
535 const GrClip& clip, 513 const GrClip& clip,
536 const GrPaint& paint, const SkPaint& skPaint , 514 const GrPaint& paint, const SkPaint& skPaint ,
537 const SkMatrix& viewMatrix, 515 const SkMatrix& viewMatrix,
538 const char text[], size_t byteLength, 516 const char text[], size_t byteLength,
539 SkScalar x, SkScalar y, const SkIRect& regio nClipBounds) { 517 SkScalar x, SkScalar y, const SkIRect& regio nClipBounds) {
540 SkAutoTUnref<GrAtlasTextBlob> blob( 518 SkAutoTUnref<GrAtlasTextBlob> blob(
541 this->createDrawTextBlob(clip, paint, skPaint, viewMatrix, 519 this->createDrawTextBlob(paint, skPaint, viewMatrix, text, byteLength, x , y));
542 text, byteLength, x, y, regionClipBounds));
543 blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPa int, paint, 520 blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPa int, paint,
544 clip, regionClipBounds); 521 clip, regionClipBounds);
545 } 522 }
546 523
547 void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc, 524 void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc,
548 const GrClip& clip, 525 const GrClip& clip,
549 const GrPaint& paint, const SkPaint& skPa int, 526 const GrPaint& paint, const SkPaint& skPa int,
550 const SkMatrix& viewMatrix, 527 const SkMatrix& viewMatrix,
551 const char text[], size_t byteLength, 528 const char text[], size_t byteLength,
552 const SkScalar pos[], int scalarsPerPosit ion, 529 const SkScalar pos[], int scalarsPerPosit ion,
553 const SkPoint& offset, const SkIRect& reg ionClipBounds) { 530 const SkPoint& offset, const SkIRect& reg ionClipBounds) {
554 SkAutoTUnref<GrAtlasTextBlob> blob( 531 SkAutoTUnref<GrAtlasTextBlob> blob(
555 this->createDrawPosTextBlob(clip, paint, skPaint, viewMatrix, 532 this->createDrawPosTextBlob(paint, skPaint, viewMatrix,
556 text, byteLength, 533 text, byteLength,
557 pos, scalarsPerPosition, 534 pos, scalarsPerPosition,
558 offset, regionClipBounds)); 535 offset));
559 536
560 blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPa int, paint, clip, 537 blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPa int, paint, clip,
561 regionClipBounds); 538 regionClipBounds);
562 } 539 }
563 540
564 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, 541 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
542 SkGlyphCache* cache,
565 const SkPaint& skPaint, GrColor colo r, 543 const SkPaint& skPaint, GrColor colo r,
566 const SkMatrix& viewMatrix, 544 const SkMatrix& viewMatrix,
567 const char text[], size_t byteLength , 545 const char text[], size_t byteLength ,
568 SkScalar x, SkScalar y, 546 SkScalar x, SkScalar y,
569 SkScalar textRatio, 547 SkScalar textRatio,
570 SkTDArray<char>* fallbackTxt,
571 SkTDArray<SkScalar>* fallbackPos,
572 SkPoint* offset,
573 const SkPaint& origPaint) { 548 const SkPaint& origPaint) {
574 SkASSERT(byteLength == 0 || text != nullptr); 549 SkASSERT(byteLength == 0 || text != nullptr);
575 550
576 // nothing to draw 551 // nothing to draw
577 if (text == nullptr || byteLength == 0) { 552 if (text == nullptr || byteLength == 0) {
578 return; 553 return;
579 } 554 }
580 555
581 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); 556 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc();
582 SkAutoDescriptor desc; 557 SkAutoDescriptor desc;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 SkScalar alignY = SkFixedToScalar(stopY); 596 SkScalar alignY = SkFixedToScalar(stopY);
622 if (origPaint.getTextAlign() == SkPaint::kCenter_Align) { 597 if (origPaint.getTextAlign() == SkPaint::kCenter_Align) {
623 alignX = SkScalarHalf(alignX); 598 alignX = SkScalarHalf(alignX);
624 alignY = SkScalarHalf(alignY); 599 alignY = SkScalarHalf(alignY);
625 } else if (origPaint.getTextAlign() == SkPaint::kLeft_Align) { 600 } else if (origPaint.getTextAlign() == SkPaint::kLeft_Align) {
626 alignX = 0; 601 alignX = 0;
627 alignY = 0; 602 alignY = 0;
628 } 603 }
629 x -= alignX; 604 x -= alignX;
630 y -= alignY; 605 y -= alignY;
631 *offset = SkPoint::Make(x, y); 606 SkPoint offset = SkPoint::Make(x, y);
632 607
633 this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text , byteLength, 608 this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatri x, text, byteLength,
634 positions.begin(), 2, *offset, textRatio, fallba ckTxt, 609 positions.begin(), 2, offset, textRatio, origPai nt);
635 fallbackPos);
636 } 610 }
637 611
638 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd ex, 612 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd ex,
639 const SkPaint& skPaint, GrColor c olor, 613 SkGlyphCache* cache,
614 const SkPaint& skPaint,
615 GrColor color,
640 const SkMatrix& viewMatrix, 616 const SkMatrix& viewMatrix,
641 const char text[], size_t byteLen gth, 617 const char text[], size_t byteLen gth,
642 const SkScalar pos[], int scalars PerPosition, 618 const SkScalar pos[], int scalars PerPosition,
643 const SkPoint& offset, 619 const SkPoint& offset,
644 SkScalar textRatio, 620 SkScalar textRatio,
645 SkTDArray<char>* fallbackTxt, 621 const SkPaint& origPaint) {
646 SkTDArray<SkScalar>* fallbackPos) {
647 622
648 SkASSERT(byteLength == 0 || text != nullptr); 623 SkASSERT(byteLength == 0 || text != nullptr);
649 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 624 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
650 625
651 // nothing to draw 626 // nothing to draw
652 if (text == nullptr || byteLength == 0) { 627 if (text == nullptr || byteLength == 0) {
653 return; 628 return;
654 } 629 }
655 630
631 SkTDArray<char> fallbackTxt;
632 SkTDArray<SkScalar> fallbackPos;
633
656 fCurrStrike = nullptr; 634 fCurrStrike = nullptr;
657 635
658 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); 636 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc();
659 SkGlyphCache* cache = this->setupCache(&blob->fRuns[runIndex], skPaint, null ptr, true);
660 GrFontScaler* fontScaler = GetGrFontScaler(cache); 637 GrFontScaler* fontScaler = GetGrFontScaler(cache);
661 638
662 const char* stop = text + byteLength; 639 const char* stop = text + byteLength;
663 640
664 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { 641 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) {
665 while (text < stop) { 642 while (text < stop) {
666 const char* lastText = text; 643 const char* lastText = text;
667 // the last 2 parameters are ignored 644 // the last 2 parameters are ignored
668 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); 645 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
669 646
670 if (glyph.fWidth) { 647 if (glyph.fWidth) {
671 SkScalar x = offset.x() + pos[0]; 648 SkScalar x = offset.x() + pos[0];
672 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0) ; 649 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0) ;
673 650
674 if (!this->dfAppendGlyph(blob, 651 if (!this->dfAppendGlyph(blob,
675 runIndex, 652 runIndex,
676 glyph, 653 glyph,
677 x, y, color, fontScaler, 654 x, y, color, fontScaler,
678 textRatio, viewMatrix)) { 655 textRatio, viewMatrix)) {
679 // couldn't append, send to fallback 656 // couldn't append, send to fallback
680 fallbackTxt->append(SkToInt(text-lastText), lastText); 657 fallbackTxt.append(SkToInt(text-lastText), lastText);
681 *fallbackPos->append() = pos[0]; 658 *fallbackPos.append() = pos[0];
682 if (2 == scalarsPerPosition) { 659 if (2 == scalarsPerPosition) {
683 *fallbackPos->append() = pos[1]; 660 *fallbackPos.append() = pos[1];
684 } 661 }
685 } 662 }
686 } 663 }
687 pos += scalarsPerPosition; 664 pos += scalarsPerPosition;
688 } 665 }
689 } else { 666 } else {
690 SkScalar alignMul = SkPaint::kCenter_Align == skPaint.getTextAlign() ? S K_ScalarHalf 667 SkScalar alignMul = SkPaint::kCenter_Align == skPaint.getTextAlign() ? S K_ScalarHalf
691 : S K_Scalar1; 668 : S K_Scalar1;
692 while (text < stop) { 669 while (text < stop) {
693 const char* lastText = text; 670 const char* lastText = text;
694 // the last 2 parameters are ignored 671 // the last 2 parameters are ignored
695 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); 672 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
696 673
697 if (glyph.fWidth) { 674 if (glyph.fWidth) {
698 SkScalar x = offset.x() + pos[0]; 675 SkScalar x = offset.x() + pos[0];
699 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0) ; 676 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0) ;
700 677
701 SkScalar advanceX = SkFixedToScalar(glyph.fAdvanceX) * alignMul * textRatio; 678 SkScalar advanceX = SkFixedToScalar(glyph.fAdvanceX) * alignMul * textRatio;
702 SkScalar advanceY = SkFixedToScalar(glyph.fAdvanceY) * alignMul * textRatio; 679 SkScalar advanceY = SkFixedToScalar(glyph.fAdvanceY) * alignMul * textRatio;
703 680
704 if (!this->dfAppendGlyph(blob, 681 if (!this->dfAppendGlyph(blob,
705 runIndex, 682 runIndex,
706 glyph, 683 glyph,
707 x - advanceX, y - advanceY, color, 684 x - advanceX, y - advanceY, color,
708 fontScaler, 685 fontScaler,
709 textRatio, 686 textRatio,
710 viewMatrix)) { 687 viewMatrix)) {
711 // couldn't append, send to fallback 688 // couldn't append, send to fallback
712 fallbackTxt->append(SkToInt(text-lastText), lastText); 689 fallbackTxt.append(SkToInt(text-lastText), lastText);
713 *fallbackPos->append() = pos[0]; 690 *fallbackPos.append() = pos[0];
714 if (2 == scalarsPerPosition) { 691 if (2 == scalarsPerPosition) {
715 *fallbackPos->append() = pos[1]; 692 *fallbackPos.append() = pos[1];
716 } 693 }
717 } 694 }
718 } 695 }
719 pos += scalarsPerPosition; 696 pos += scalarsPerPosition;
720 } 697 }
721 } 698 }
722 699
723 SkGlyphCache::AttachCache(cache); 700 if (fallbackTxt.count()) {
jvanverth1 2015/12/11 18:12:57 +1. This makes a lot more sense than passing it ou
701 this->fallbackDrawPosText(blob, runIndex, origPaint.getColor(), origPain t, viewMatrix,
702 fallbackTxt, fallbackPos, scalarsPerPosition, offset);
703 }
724 } 704 }
725 705
726 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, 706 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
727 const SkGlyph& skGlyph, 707 const SkGlyph& skGlyph,
728 SkScalar sx, SkScalar sy, GrColor color, 708 SkScalar sx, SkScalar sy, GrColor color,
729 GrFontScaler* scaler, 709 GrFontScaler* scaler,
730 SkScalar textRatio, const SkMatrix& viewM atrix) { 710 SkScalar textRatio, const SkMatrix& viewM atrix) {
731 if (!fCurrStrike) { 711 if (!fCurrStrike) {
732 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); 712 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
733 } 713 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 GrPaint grPaint; 776 GrPaint grPaint;
797 if (!SkPaintToGrPaint(context, skPaint, viewMatrix, &grPaint)) { 777 if (!SkPaintToGrPaint(context, skPaint, viewMatrix, &grPaint)) {
798 SkFAIL("couldn't convert paint\n"); 778 SkFAIL("couldn't convert paint\n");
799 } 779 }
800 780
801 const char* text = "The quick brown fox jumps over the lazy dog."; 781 const char* text = "The quick brown fox jumps over the lazy dog.";
802 int textLen = (int)strlen(text); 782 int textLen = (int)strlen(text);
803 783
804 // Setup clip 784 // Setup clip
805 GrClip clip; 785 GrClip clip;
806 SkIRect noClip = SkIRect::MakeLargest();
807 786
808 // right now we don't handle textblobs, nor do we handle drawPosText. Since we only 787 // right now we don't handle textblobs, nor do we handle drawPosText. Since we only
809 // intend to test the batch with this unit test, that is okay. 788 // intend to test the batch with this unit test, that is okay.
810 SkAutoTUnref<GrAtlasTextBlob> blob( 789 SkAutoTUnref<GrAtlasTextBlob> blob(
811 gTextContext->createDrawTextBlob(clip, grPaint, skPaint, viewMatrix, text, 790 gTextContext->createDrawTextBlob(grPaint, skPaint, viewMatrix, text,
812 static_cast<size_t>(textLen), 0, 0, noClip)); 791 static_cast<size_t>(textLen), 0, 0) );
813 792
814 SkScalar transX = static_cast<SkScalar>(random->nextU()); 793 SkScalar transX = static_cast<SkScalar>(random->nextU());
815 SkScalar transY = static_cast<SkScalar>(random->nextU()); 794 SkScalar transY = static_cast<SkScalar>(random->nextU());
816 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0] ; 795 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0] ;
817 return blob->createBatch(info, textLen, 0, 0, color, transX, transY, skPaint , 796 return blob->createBatch(info, textLen, 0, 0, color, transX, transY, skPaint ,
818 gSurfaceProps, gTextContext->dfAdjustTable(), 797 gSurfaceProps, gTextContext->dfAdjustTable(),
819 context->getBatchFontCache()); 798 context->getBatchFontCache());
820 } 799 }
821 800
822 #endif 801 #endif
OLDNEW
« no previous file with comments | « src/gpu/text/GrAtlasTextContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698