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

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

Issue 636183005: Fix color emoji. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Check for atlas ownership when searching ClientPlotUsage. Created 6 years, 2 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/GrBitmapTextContext.h ('k') | src/gpu/GrDistanceFieldTextContext.cpp » ('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 2013 Google Inc. 2 * Copyright 2013 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 7
8 #include "GrBitmapTextContext.h" 8 #include "GrBitmapTextContext.h"
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrDrawTarget.h" 10 #include "GrDrawTarget.h"
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 } 363 }
364 } 364 }
365 365
366 if (NULL == glyph->fPlot) { 366 if (NULL == glyph->fPlot) {
367 if (!fStrike->glyphTooLargeForAtlas(glyph)) { 367 if (!fStrike->glyphTooLargeForAtlas(glyph)) {
368 if (fStrike->addGlyphToAtlas(glyph, scaler)) { 368 if (fStrike->addGlyphToAtlas(glyph, scaler)) {
369 goto HAS_ATLAS; 369 goto HAS_ATLAS;
370 } 370 }
371 371
372 // try to clear out an unused plot before we flush 372 // try to clear out an unused plot before we flush
373 if (fContext->getFontCache()->freeUnusedPlot(fStrike) && 373 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
374 fStrike->addGlyphToAtlas(glyph, scaler)) { 374 fStrike->addGlyphToAtlas(glyph, scaler)) {
375 goto HAS_ATLAS; 375 goto HAS_ATLAS;
376 } 376 }
377 377
378 if (c_DumpFontCache) { 378 if (c_DumpFontCache) {
379 #ifdef SK_DEVELOPER 379 #ifdef SK_DEVELOPER
380 fContext->getFontCache()->dump(); 380 fContext->getFontCache()->dump();
381 #endif 381 #endif
382 } 382 }
383 383
384 // flush any accumulated draws to allow us to free up a plot 384 // flush any accumulated draws to allow us to free up a plot
385 this->flush(); 385 this->flush();
386 fContext->flush(); 386 fContext->flush();
387 387
388 // we should have an unused plot now 388 // we should have an unused plot now
389 if (fContext->getFontCache()->freeUnusedPlot(fStrike) && 389 if (fContext->getFontCache()->freeUnusedPlot(fStrike, glyph) &&
390 fStrike->addGlyphToAtlas(glyph, scaler)) { 390 fStrike->addGlyphToAtlas(glyph, scaler)) {
391 goto HAS_ATLAS; 391 goto HAS_ATLAS;
392 } 392 }
393 } 393 }
394 394
395 if (NULL == glyph->fPath) { 395 if (NULL == glyph->fPath) {
396 SkPath* path = SkNEW(SkPath); 396 SkPath* path = SkNEW(SkPath);
397 if (!scaler->getGlyphPath(glyph->glyphID(), path)) { 397 if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
398 // flag the glyph as being dead? 398 // flag the glyph as being dead?
399 delete path; 399 delete path;
(...skipping 15 matching lines...) Expand all
415 415
416 HAS_ATLAS: 416 HAS_ATLAS:
417 SkASSERT(glyph->fPlot); 417 SkASSERT(glyph->fPlot);
418 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken(); 418 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken();
419 glyph->fPlot->setDrawToken(drawToken); 419 glyph->fPlot->setDrawToken(drawToken);
420 420
421 // now promote them to fixed (TODO: Rethink using fixed pt). 421 // now promote them to fixed (TODO: Rethink using fixed pt).
422 width = SkIntToFixed(width); 422 width = SkIntToFixed(width);
423 height = SkIntToFixed(height); 423 height = SkIntToFixed(height);
424 424
425 // the current texture/maskformat must match what the glyph needs
425 GrTexture* texture = glyph->fPlot->texture(); 426 GrTexture* texture = glyph->fPlot->texture();
426 SkASSERT(texture); 427 SkASSERT(texture);
427 428
428 if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { 429 if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) {
429 this->flush(); 430 this->flush();
430 fCurrTexture = texture; 431 fCurrTexture = texture;
431 fCurrTexture->ref(); 432 fCurrTexture->ref();
433 fCurrMaskFormat = glyph->fMaskFormat;
432 } 434 }
433 435
434 bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); 436 bool useColorVerts = kA8_GrMaskFormat == fCurrMaskFormat;
435 437
436 if (NULL == fVertices) { 438 if (NULL == fVertices) {
437 // If we need to reserve vertices allow the draw target to suggest 439 // If we need to reserve vertices allow the draw target to suggest
438 // a number of verts to reserve and whether to perform a flush. 440 // a number of verts to reserve and whether to perform a flush.
439 fMaxVertices = kMinRequestedVerts; 441 fMaxVertices = kMinRequestedVerts;
440 if (useColorVerts) { 442 if (useColorVerts) {
441 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttri bs>( 443 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttri bs>(
442 SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize); 444 SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize);
443 } else { 445 } else {
444 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( 446 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 544
543 if (textureUniqueID != fEffectTextureUniqueID) { 545 if (textureUniqueID != fEffectTextureUniqueID) {
544 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(f CurrTexture, 546 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(f CurrTexture,
545 p arams)); 547 p arams));
546 fEffectTextureUniqueID = textureUniqueID; 548 fEffectTextureUniqueID = textureUniqueID;
547 } 549 }
548 550
549 // This effect could be stored with one of the cache objects (atlas?) 551 // This effect could be stored with one of the cache objects (atlas?)
550 drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); 552 drawState->setGeometryProcessor(fCachedGeometryProcessor.get());
551 SkASSERT(fStrike); 553 SkASSERT(fStrike);
552 switch (fStrike->getMaskFormat()) { 554 switch (fCurrMaskFormat) {
553 // Color bitmap text 555 // Color bitmap text
554 case kARGB_GrMaskFormat: 556 case kARGB_GrMaskFormat:
555 SkASSERT(!drawState->hasColorVertexAttribute()); 557 SkASSERT(!drawState->hasColorVertexAttribute());
556 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff()); 558 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff());
557 drawState->setColor(0xffffffff); 559 drawState->setAlpha(fSkPaint.getAlpha());
558 break; 560 break;
559 // LCD text 561 // LCD text
560 case kA888_GrMaskFormat: 562 case kA888_GrMaskFormat:
561 case kA565_GrMaskFormat: { 563 case kA565_GrMaskFormat: {
562 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || 564 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() ||
563 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || 565 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() ||
564 fPaint.numColorStages()) { 566 fPaint.numColorStages()) {
565 GrPrintf("LCD Text will not draw correctly.\n"); 567 GrPrintf("LCD Text will not draw correctly.\n");
566 } 568 }
567 SkASSERT(!drawState->hasColorVertexAttribute()); 569 SkASSERT(!drawState->hasColorVertexAttribute());
(...skipping 10 matching lines...) Expand all
578 break; 580 break;
579 } 581 }
580 // Grayscale/BW text 582 // Grayscale/BW text
581 case kA8_GrMaskFormat: 583 case kA8_GrMaskFormat:
582 // set back to normal in case we took LCD path previously. 584 // set back to normal in case we took LCD path previously.
583 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff()); 585 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff());
584 // We're using per-vertex color. 586 // We're using per-vertex color.
585 SkASSERT(drawState->hasColorVertexAttribute()); 587 SkASSERT(drawState->hasColorVertexAttribute());
586 break; 588 break;
587 default: 589 default:
588 SkFAIL("Unexepected mask format."); 590 SkFAIL("Unexpected mask format.");
589 } 591 }
590 int nGlyphs = fCurrVertex / 4; 592 int nGlyphs = fCurrVertex / 4;
591 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); 593 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
592 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, 594 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
593 nGlyphs, 595 nGlyphs,
594 4, 6, &fVertexBounds); 596 4, 6, &fVertexBounds);
595 597
596 fDrawTarget->resetVertexSource(); 598 fDrawTarget->resetVertexSource();
597 fVertices = NULL; 599 fVertices = NULL;
598 fMaxVertices = 0; 600 fMaxVertices = 0;
599 fCurrVertex = 0; 601 fCurrVertex = 0;
600 fVertexBounds.setLargestInverted(); 602 fVertexBounds.setLargestInverted();
601 SkSafeSetNull(fCurrTexture); 603 SkSafeSetNull(fCurrTexture);
602 } 604 }
603 } 605 }
604 606
605 inline void GrBitmapTextContext::finish() { 607 inline void GrBitmapTextContext::finish() {
606 this->flush(); 608 this->flush();
607 609
608 GrTextContext::finish(); 610 GrTextContext::finish();
609 } 611 }
610 612
OLDNEW
« no previous file with comments | « src/gpu/GrBitmapTextContext.h ('k') | src/gpu/GrDistanceFieldTextContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698