| OLD | NEW |
| 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 Loading... |
| 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, glyph) && | 373 if (fContext->getFontCache()->freeUnusedPlot(fStrike) && |
| 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, glyph) && | 389 if (fContext->getFontCache()->freeUnusedPlot(fStrike) && |
| 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 Loading... |
| 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 | |
| 426 GrTexture* texture = glyph->fPlot->texture(); | 425 GrTexture* texture = glyph->fPlot->texture(); |
| 427 SkASSERT(texture); | 426 SkASSERT(texture); |
| 428 | 427 |
| 429 if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { | 428 if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { |
| 430 this->flush(); | 429 this->flush(); |
| 431 fCurrTexture = texture; | 430 fCurrTexture = texture; |
| 432 fCurrTexture->ref(); | 431 fCurrTexture->ref(); |
| 433 fCurrMaskFormat = glyph->fMaskFormat; | |
| 434 } | 432 } |
| 435 | 433 |
| 436 bool useColorVerts = kA8_GrMaskFormat == fCurrMaskFormat; | 434 bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); |
| 437 | 435 |
| 438 if (NULL == fVertices) { | 436 if (NULL == fVertices) { |
| 439 // If we need to reserve vertices allow the draw target to suggest | 437 // If we need to reserve vertices allow the draw target to suggest |
| 440 // a number of verts to reserve and whether to perform a flush. | 438 // a number of verts to reserve and whether to perform a flush. |
| 441 fMaxVertices = kMinRequestedVerts; | 439 fMaxVertices = kMinRequestedVerts; |
| 442 if (useColorVerts) { | 440 if (useColorVerts) { |
| 443 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttri
bs>( | 441 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttri
bs>( |
| 444 SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize); | 442 SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize); |
| 445 } else { | 443 } else { |
| 446 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( | 444 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 | 542 |
| 545 if (textureUniqueID != fEffectTextureUniqueID) { | 543 if (textureUniqueID != fEffectTextureUniqueID) { |
| 546 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(f
CurrTexture, | 544 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(f
CurrTexture, |
| 547 p
arams)); | 545 p
arams)); |
| 548 fEffectTextureUniqueID = textureUniqueID; | 546 fEffectTextureUniqueID = textureUniqueID; |
| 549 } | 547 } |
| 550 | 548 |
| 551 // This effect could be stored with one of the cache objects (atlas?) | 549 // This effect could be stored with one of the cache objects (atlas?) |
| 552 drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); | 550 drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); |
| 553 SkASSERT(fStrike); | 551 SkASSERT(fStrike); |
| 554 switch (fCurrMaskFormat) { | 552 switch (fStrike->getMaskFormat()) { |
| 555 // Color bitmap text | 553 // Color bitmap text |
| 556 case kARGB_GrMaskFormat: | 554 case kARGB_GrMaskFormat: |
| 557 SkASSERT(!drawState->hasColorVertexAttribute()); | 555 SkASSERT(!drawState->hasColorVertexAttribute()); |
| 558 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst
BlendCoeff()); | 556 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst
BlendCoeff()); |
| 559 drawState->setAlpha(fSkPaint.getAlpha()); | 557 drawState->setColor(0xffffffff); |
| 560 break; | 558 break; |
| 561 // LCD text | 559 // LCD text |
| 562 case kA888_GrMaskFormat: | 560 case kA888_GrMaskFormat: |
| 563 case kA565_GrMaskFormat: { | 561 case kA565_GrMaskFormat: { |
| 564 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || | 562 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || |
| 565 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || | 563 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || |
| 566 fPaint.numColorStages()) { | 564 fPaint.numColorStages()) { |
| 567 GrPrintf("LCD Text will not draw correctly.\n"); | 565 GrPrintf("LCD Text will not draw correctly.\n"); |
| 568 } | 566 } |
| 569 SkASSERT(!drawState->hasColorVertexAttribute()); | 567 SkASSERT(!drawState->hasColorVertexAttribute()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 580 break; | 578 break; |
| 581 } | 579 } |
| 582 // Grayscale/BW text | 580 // Grayscale/BW text |
| 583 case kA8_GrMaskFormat: | 581 case kA8_GrMaskFormat: |
| 584 // set back to normal in case we took LCD path previously. | 582 // set back to normal in case we took LCD path previously. |
| 585 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst
BlendCoeff()); | 583 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst
BlendCoeff()); |
| 586 // We're using per-vertex color. | 584 // We're using per-vertex color. |
| 587 SkASSERT(drawState->hasColorVertexAttribute()); | 585 SkASSERT(drawState->hasColorVertexAttribute()); |
| 588 break; | 586 break; |
| 589 default: | 587 default: |
| 590 SkFAIL("Unexpected mask format."); | 588 SkFAIL("Unexepected mask format."); |
| 591 } | 589 } |
| 592 int nGlyphs = fCurrVertex / 4; | 590 int nGlyphs = fCurrVertex / 4; |
| 593 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); | 591 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
| 594 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, | 592 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, |
| 595 nGlyphs, | 593 nGlyphs, |
| 596 4, 6, &fVertexBounds); | 594 4, 6, &fVertexBounds); |
| 597 | 595 |
| 598 fDrawTarget->resetVertexSource(); | 596 fDrawTarget->resetVertexSource(); |
| 599 fVertices = NULL; | 597 fVertices = NULL; |
| 600 fMaxVertices = 0; | 598 fMaxVertices = 0; |
| 601 fCurrVertex = 0; | 599 fCurrVertex = 0; |
| 602 fVertexBounds.setLargestInverted(); | 600 fVertexBounds.setLargestInverted(); |
| 603 SkSafeSetNull(fCurrTexture); | 601 SkSafeSetNull(fCurrTexture); |
| 604 } | 602 } |
| 605 } | 603 } |
| 606 | 604 |
| 607 inline void GrBitmapTextContext::finish() { | 605 inline void GrBitmapTextContext::finish() { |
| 608 this->flush(); | 606 this->flush(); |
| 609 | 607 |
| 610 GrTextContext::finish(); | 608 GrTextContext::finish(); |
| 611 } | 609 } |
| 612 | 610 |
| OLD | NEW |