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

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

Issue 732693002: Drawstate on stack (Closed) Base URL: https://skia.googlesource.com/skia.git@real_def_gp
Patch Set: ready Created 6 years, 1 month 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
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 "GrDefaultGeoProcFactory.h" 10 #include "GrDefaultGeoProcFactory.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 fTotalVertexCount = 0; 73 fTotalVertexCount = 0;
74 74
75 fVertexBounds.setLargestInverted(); 75 fVertexBounds.setLargestInverted();
76 } 76 }
77 77
78 GrBitmapTextContext* GrBitmapTextContext::Create(GrContext* context, 78 GrBitmapTextContext* GrBitmapTextContext::Create(GrContext* context,
79 const SkDeviceProperties& props ) { 79 const SkDeviceProperties& props ) {
80 return SkNEW_ARGS(GrBitmapTextContext, (context, props)); 80 return SkNEW_ARGS(GrBitmapTextContext, (context, props));
81 } 81 }
82 82
83 GrBitmapTextContext::~GrBitmapTextContext() {
84 this->finish();
85 }
86
87 bool GrBitmapTextContext::canDraw(const SkPaint& paint) { 83 bool GrBitmapTextContext::canDraw(const SkPaint& paint) {
88 return !SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix()); 84 return !SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix());
89 } 85 }
90 86
91 inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai nt) { 87 inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai nt) {
92 GrTextContext::init(paint, skPaint); 88 GrTextContext::init(paint, skPaint);
93 89
94 fStrike = NULL; 90 fStrike = NULL;
95 91
96 fCurrTexture = NULL; 92 fCurrTexture = NULL;
97 fCurrVertex = 0; 93 fCurrVertex = 0;
98 94
99 fVertices = NULL; 95 fVertices = NULL;
100 fAllocVertexCount = 0; 96 fAllocVertexCount = 0;
101 fTotalVertexCount = 0; 97 fTotalVertexCount = 0;
102 } 98 }
103 99
104 void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPain t, 100 void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPain t,
105 const char text[], size_t byteLength, 101 const char text[], size_t byteLength,
106 SkScalar x, SkScalar y) { 102 SkScalar x, SkScalar y) {
107 SkASSERT(byteLength == 0 || text != NULL); 103 SkASSERT(byteLength == 0 || text != NULL);
108 104
109 // nothing to draw 105 // nothing to draw
110 if (text == NULL || byteLength == 0 /*|| fRC->isEmpty()*/) { 106 if (text == NULL || byteLength == 0 /*|| fRC->isEmpty()*/) {
111 return; 107 return;
112 } 108 }
113 109
114 this->init(paint, skPaint); 110 this->init(paint, skPaint);
115 111
116 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); 112 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc();
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 } 185 }
190 186
191 fx += glyph.fAdvanceX; 187 fx += glyph.fAdvanceX;
192 fy += glyph.fAdvanceY; 188 fy += glyph.fAdvanceY;
193 } 189 }
194 190
195 this->finish(); 191 this->finish();
196 } 192 }
197 193
198 void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skP aint, 194 void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skP aint,
199 const char text[], size_t byteLength, 195 const char text[], size_t byteLength,
200 const SkScalar pos[], int scalarsPerPositi on, 196 const SkScalar pos[], int scalarsPerPosi tion,
201 const SkPoint& offset) { 197 const SkPoint& offset) {
202 SkASSERT(byteLength == 0 || text != NULL); 198 SkASSERT(byteLength == 0 || text != NULL);
203 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 199 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
204 200
205 // nothing to draw 201 // nothing to draw
206 if (text == NULL || byteLength == 0/* || fRC->isEmpty()*/) { 202 if (text == NULL || byteLength == 0/* || fRC->isEmpty()*/) {
207 return; 203 return;
208 } 204 }
209 205
210 this->init(paint, skPaint); 206 this->init(paint, skPaint);
211 207
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 fontScaler); 340 fontScaler);
345 } 341 }
346 pos += scalarsPerPosition; 342 pos += scalarsPerPosition;
347 } 343 }
348 } 344 }
349 } 345 }
350 346
351 this->finish(); 347 this->finish();
352 } 348 }
353 349
354 static void* alloc_vertices(GrDrawTarget* drawTarget, int numVertices, GrMaskFor mat maskFormat) { 350 static size_t get_vertex_stride(GrMaskFormat maskFormat) {
351 switch (maskFormat) {
352 case kA8_GrMaskFormat:
353 return kGrayTextVASize;
354 case kARGB_GrMaskFormat:
355 return kColorTextVASize;
356 default:
357 return kLCDTextVASize;
358 }
359 }
360
361 static void set_vertex_attributes(GrDrawState* drawState, GrMaskFormat maskForma t) {
362 if (kA8_GrMaskFormat == maskFormat) {
363 drawState->setVertexAttribs<gGrayVertexAttribs>(
364 SK_ARRAY_COUNT(gGrayVertexAttribs), kGrayTex tVASize);
365 } else if (kARGB_GrMaskFormat == maskFormat) {
366 GrDefaultGeoProcFactory::SetAttribs(drawState,
367 GrDefaultGeoProcFactory::kLocalCoord _GPType);
368 } else {
369 drawState->setVertexAttribs<gLCDVertexAttribs>(
370 SK_ARRAY_COUNT(gLCDVertexAttribs), kLCDTextV ASize);
371 }
372 }
373
374 static void* alloc_vertices(GrDrawTarget* drawTarget,
375 int numVertices,
376 GrMaskFormat maskFormat) {
355 if (numVertices <= 0) { 377 if (numVertices <= 0) {
356 return NULL; 378 return NULL;
357 } 379 }
358 380
359 // set up attributes 381 // set up attributes
360 if (kA8_GrMaskFormat == maskFormat) {
361 drawTarget->drawState()->setVertexAttribs<gGrayVertexAttribs>(
362 SK_ARRAY_COUNT(gGrayVertexAttribs), kGrayTex tVASize);
363 } else if (kARGB_GrMaskFormat == maskFormat) {
364 GrDefaultGeoProcFactory::SetAttribs(drawTarget->drawState(),
365 GrDefaultGeoProcFactory::kLocalCoord _GPType);
366 } else {
367 drawTarget->drawState()->setVertexAttribs<gLCDVertexAttribs>(
368 SK_ARRAY_COUNT(gLCDVertexAttribs), kLCDTextV ASize);
369 }
370 void* vertices = NULL; 382 void* vertices = NULL;
371 bool success = drawTarget->reserveVertexAndIndexSpace(numVertices, 383 bool success = drawTarget->reserveVertexAndIndexSpace(numVertices,
384 get_vertex_stride(mask Format),
372 0, 385 0,
373 &vertices, 386 &vertices,
374 NULL); 387 NULL);
375 GrAlwaysAssert(success); 388 GrAlwaysAssert(success);
376 return vertices; 389 return vertices;
377 } 390 }
378 391
379 void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed, 392 void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed,
380 SkFixed vx, SkFixed vy, 393 SkFixed vx, SkFixed vy,
381 GrFontScaler* scaler) { 394 GrFontScaler* scaler) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY); 508 SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY);
496 509
497 SkRect r; 510 SkRect r;
498 r.fLeft = SkFixedToFloat(vx); 511 r.fLeft = SkFixedToFloat(vx);
499 r.fTop = SkFixedToFloat(vy); 512 r.fTop = SkFixedToFloat(vy);
500 r.fRight = SkFixedToFloat(vx + width); 513 r.fRight = SkFixedToFloat(vx + width);
501 r.fBottom = SkFixedToFloat(vy + height); 514 r.fBottom = SkFixedToFloat(vy + height);
502 515
503 fVertexBounds.joinNonEmptyArg(r); 516 fVertexBounds.joinNonEmptyArg(r);
504 517
505 size_t vertSize; 518 size_t vertSize = get_vertex_stride(fCurrMaskFormat);
506 switch (fCurrMaskFormat) {
507 case kA8_GrMaskFormat:
508 vertSize = kGrayTextVASize;
509 break;
510 case kARGB_GrMaskFormat:
511 vertSize = kColorTextVASize;
512 default:
513 vertSize = kLCDTextVASize;
514 }
515
516 SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexStride());
517 519
518 SkPoint* positions = reinterpret_cast<SkPoint*>( 520 SkPoint* positions = reinterpret_cast<SkPoint*>(
519 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); 521 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex);
520 positions->setRectFan(r.fLeft, r.fTop, r.fRight, r.fBottom, vertSize); 522 positions->setRectFan(r.fLeft, r.fTop, r.fRight, r.fBottom, vertSize);
521 523
522 // The texture coords are last in both the with and without color vertex lay outs. 524 // The texture coords are last in both the with and without color vertex lay outs.
523 SkPoint* textureCoords = reinterpret_cast<SkPoint*>( 525 SkPoint* textureCoords = reinterpret_cast<SkPoint*>(
524 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint)) ; 526 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint)) ;
525 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normalizeFix edX(tx)), 527 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normalizeFix edX(tx)),
526 SkFixedToFloat(texture->texturePriv().normalizeFix edY(ty)), 528 SkFixedToFloat(texture->texturePriv().normalizeFix edY(ty)),
527 SkFixedToFloat(texture->texturePriv().normalizeFix edX(tx + width)), 529 SkFixedToFloat(texture->texturePriv().normalizeFix edX(tx + width)),
528 SkFixedToFloat(texture->texturePriv().normalizeFix edY(ty + height)), 530 SkFixedToFloat(texture->texturePriv().normalizeFix edY(ty + height)),
529 vertSize); 531 vertSize);
530 if (kA8_GrMaskFormat == fCurrMaskFormat) { 532 if (kA8_GrMaskFormat == fCurrMaskFormat) {
531 if (0xFF == GrColorUnpackA(fPaint.getColor())) {
532 fDrawTarget->drawState()->setHint(GrDrawState::kVertexColorsAreOpaqu e_Hint, true);
533 }
534 // color comes after position. 533 // color comes after position.
535 GrColor* colors = reinterpret_cast<GrColor*>(positions + 1); 534 GrColor* colors = reinterpret_cast<GrColor*>(positions + 1);
536 for (int i = 0; i < 4; ++i) { 535 for (int i = 0; i < 4; ++i) {
537 *colors = fPaint.getColor(); 536 *colors = fPaint.getColor();
538 colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(colors ) + vertSize); 537 colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(colors ) + vertSize);
539 } 538 }
540 } 539 }
541 fCurrVertex += 4; 540 fCurrVertex += 4;
542 } 541 }
543 542
544 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { 543 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) {
545 unsigned r = SkColorGetR(c); 544 unsigned r = SkColorGetR(c);
546 unsigned g = SkColorGetG(c); 545 unsigned g = SkColorGetG(c);
547 unsigned b = SkColorGetB(c); 546 unsigned b = SkColorGetB(c);
548 return GrColorPackRGBA(r, g, b, 0xff); 547 return GrColorPackRGBA(r, g, b, 0xff);
549 } 548 }
550 549
551 void GrBitmapTextContext::flush() { 550 void GrBitmapTextContext::flush() {
552 if (NULL == fDrawTarget) { 551 if (NULL == fDrawTarget) {
553 return; 552 return;
554 } 553 }
555 554
556 GrDrawState* drawState = fDrawTarget->drawState(); 555 GrDrawState drawState;
557 GrDrawState::AutoRestoreEffects are(drawState); 556 drawState.setFromPaint(fPaint, SkMatrix::I(), fContext->getRenderTarget());
558 drawState->setFromPaint(fPaint, SkMatrix::I(), fContext->getRenderTarget()); 557
558 set_vertex_attributes(&drawState, fCurrMaskFormat);
559 559
560 if (fCurrVertex > 0) { 560 if (fCurrVertex > 0) {
561 // setup our sampler state for our text texture/atlas 561 // setup our sampler state for our text texture/atlas
562 SkASSERT(SkIsAlign4(fCurrVertex)); 562 SkASSERT(SkIsAlign4(fCurrVertex));
563 SkASSERT(fCurrTexture); 563 SkASSERT(fCurrTexture);
564 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNon e_FilterMode); 564 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNon e_FilterMode);
565 565
566 // This effect could be stored with one of the cache objects (atlas?) 566 // This effect could be stored with one of the cache objects (atlas?)
567 if (kARGB_GrMaskFormat == fCurrMaskFormat) { 567 if (kARGB_GrMaskFormat == fCurrMaskFormat) {
568 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(true ))->unref(); 568 drawState.setGeometryProcessor(GrDefaultGeoProcFactory::Create(true) )->unref();
569 GrFragmentProcessor* fragProcessor = GrSimpleTextureEffect::Create(f CurrTexture, 569 GrFragmentProcessor* fragProcessor = GrSimpleTextureEffect::Create(f CurrTexture,
570 S kMatrix::I(), 570 S kMatrix::I(),
571 p arams); 571 p arams);
572 drawState->addColorProcessor(fragProcessor)->unref(); 572 drawState.addColorProcessor(fragProcessor)->unref();
573 } else { 573 } else {
574 uint32_t textureUniqueID = fCurrTexture->getUniqueID(); 574 uint32_t textureUniqueID = fCurrTexture->getUniqueID();
575 if (textureUniqueID != fEffectTextureUniqueID) { 575 if (textureUniqueID != fEffectTextureUniqueID) {
576 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Crea te(fCurrTexture, 576 fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Crea te(fCurrTexture,
577 params)); 577 params));
578 fEffectTextureUniqueID = textureUniqueID; 578 fEffectTextureUniqueID = textureUniqueID;
579 } 579 }
580 580
581 drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); 581 drawState.setGeometryProcessor(fCachedGeometryProcessor.get());
582 } 582 }
583 583
584 SkASSERT(fStrike); 584 SkASSERT(fStrike);
585 switch (fCurrMaskFormat) { 585 switch (fCurrMaskFormat) {
586 // Color bitmap text 586 // Color bitmap text
587 case kARGB_GrMaskFormat: 587 case kARGB_GrMaskFormat:
588 SkASSERT(!drawState->hasColorVertexAttribute()); 588 SkASSERT(!drawState.hasColorVertexAttribute());
589 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff()); 589 drawState.setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstB lendCoeff());
590 drawState->setAlpha(fSkPaint.getAlpha()); 590 drawState.setAlpha(fSkPaint.getAlpha());
591 break; 591 break;
592 // LCD text 592 // LCD text
593 case kA888_GrMaskFormat: 593 case kA888_GrMaskFormat:
594 case kA565_GrMaskFormat: { 594 case kA565_GrMaskFormat: {
595 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || 595 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() ||
596 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || 596 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() ||
597 fPaint.numColorStages()) { 597 fPaint.numColorStages()) {
598 SkDebugf("LCD Text will not draw correctly.\n"); 598 SkDebugf("LCD Text will not draw correctly.\n");
599 } 599 }
600 SkASSERT(!drawState->hasColorVertexAttribute()); 600 SkASSERT(!drawState.hasColorVertexAttribute());
601 // We don't use the GrPaint's color in this case because it's be en premultiplied by 601 // We don't use the GrPaint's color in this case because it's be en premultiplied by
602 // alpha. Instead we feed in a non-premultiplied color, and mult iply its alpha by 602 // alpha. Instead we feed in a non-premultiplied color, and mult iply its alpha by
603 // the mask texture color. The end result is that we get 603 // the mask texture color. The end result is that we get
604 // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*d stColor 604 // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*d stColor
605 int a = SkColorGetA(fSkPaint.getColor()); 605 int a = SkColorGetA(fSkPaint.getColor());
606 // paintAlpha 606 // paintAlpha
607 drawState->setColor(SkColorSetARGB(a, a, a, a)); 607 drawState.setColor(SkColorSetARGB(a, a, a, a));
608 // paintColor 608 // paintColor
609 drawState->setBlendConstant(skcolor_to_grcolor_nopremultiply(fSk Paint.getColor())); 609 drawState.setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkP aint.getColor()));
610 drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff) ; 610 drawState.setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff);
611 break; 611 break;
612 } 612 }
613 // Grayscale/BW text 613 // Grayscale/BW text
614 case kA8_GrMaskFormat: 614 case kA8_GrMaskFormat:
615 drawState.setHint(GrDrawState::kVertexColorsAreOpaque_Hint,
616 0xFF == GrColorUnpackA(fPaint.getColor()));
615 // set back to normal in case we took LCD path previously. 617 // set back to normal in case we took LCD path previously.
616 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDst BlendCoeff()); 618 drawState.setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstB lendCoeff());
617 // We're using per-vertex color. 619 // We're using per-vertex color.
618 SkASSERT(drawState->hasColorVertexAttribute()); 620 SkASSERT(drawState.hasColorVertexAttribute());
619 break; 621 break;
620 default: 622 default:
621 SkFAIL("Unexpected mask format."); 623 SkFAIL("Unexpected mask format.");
622 } 624 }
623 int nGlyphs = fCurrVertex / kVerticesPerGlyph; 625 int nGlyphs = fCurrVertex / kVerticesPerGlyph;
624 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); 626 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
625 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, 627 fDrawTarget->drawIndexedInstances(&drawState,
628 kTriangles_GrPrimitiveType,
626 nGlyphs, 629 nGlyphs,
627 kVerticesPerGlyph, kIndicesPerGlyph, & fVertexBounds); 630 kVerticesPerGlyph,
631 kIndicesPerGlyph,
632 &fVertexBounds);
628 633
629 fDrawTarget->resetVertexSource(); 634 fDrawTarget->resetVertexSource();
630 fVertices = NULL; 635 fVertices = NULL;
631 fAllocVertexCount = 0; 636 fAllocVertexCount = 0;
632 // reset to be those that are left 637 // reset to be those that are left
633 fTotalVertexCount -= fCurrVertex; 638 fTotalVertexCount -= fCurrVertex;
634 fCurrVertex = 0; 639 fCurrVertex = 0;
635 fVertexBounds.setLargestInverted(); 640 fVertexBounds.setLargestInverted();
636 SkSafeSetNull(fCurrTexture); 641 SkSafeSetNull(fCurrTexture);
637 } 642 }
638 } 643 }
639 644
640 inline void GrBitmapTextContext::finish() { 645 inline void GrBitmapTextContext::finish() {
641 this->flush(); 646 this->flush();
642 fTotalVertexCount = 0; 647 fTotalVertexCount = 0;
643 648
644 GrTextContext::finish(); 649 GrTextContext::finish();
645 } 650 }
646 651
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698