diff options
author | 2015-03-25 14:02:37 -0700 | |
---|---|---|
committer | 2015-03-25 14:02:37 -0700 | |
commit | e68f7362b1e00e88688906de6384e4e5a83076d0 (patch) | |
tree | 5020c5280d38a5a9f3171e853bb5d3d5c72bbdd0 /src | |
parent | 9c59ebc0db7cade1537591813430f7be47123e76 (diff) |
Add more parameters to GrTextContext::canDraw
Updates canDraw to accept all the same Skia/Gr objects as the drawText
functions, since that information may very well be relevant in
determining whether a context can draw.
Also moves the onDrawTextBlob implementation directly into
drawTextBlob.
BUG=skia:
Review URL: https://codereview.chromium.org/1010113004
Diffstat (limited to 'src')
-rwxr-xr-x | src/gpu/GrBitmapTextContext.cpp | 8 | ||||
-rw-r--r-- | src/gpu/GrBitmapTextContext.h | 21 | ||||
-rwxr-xr-x | src/gpu/GrDistanceFieldTextContext.cpp | 14 | ||||
-rw-r--r-- | src/gpu/GrDistanceFieldTextContext.h | 21 | ||||
-rw-r--r-- | src/gpu/GrStencilAndCoverTextContext.cpp | 18 | ||||
-rw-r--r-- | src/gpu/GrStencilAndCoverTextContext.h | 21 | ||||
-rw-r--r-- | src/gpu/GrTextContext.cpp | 105 | ||||
-rw-r--r-- | src/gpu/GrTextContext.h | 6 |
8 files changed, 104 insertions, 110 deletions
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp index 4061c48821..dd01e7d2b8 100755 --- a/src/gpu/GrBitmapTextContext.cpp +++ b/src/gpu/GrBitmapTextContext.cpp @@ -68,8 +68,12 @@ GrBitmapTextContext* GrBitmapTextContext::Create(GrContext* context, return SkNEW_ARGS(GrBitmapTextContext, (context, gpuDevice, props)); } -bool GrBitmapTextContext::canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) { - return !SkDraw::ShouldDrawTextAsPaths(paint, viewMatrix); +bool GrBitmapTextContext::canDraw(const GrRenderTarget* rt, + const GrClip& clip, + const GrPaint& paint, + const SkPaint& skPaint, + const SkMatrix& viewMatrix) { + return !SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix); } inline void GrBitmapTextContext::init(GrRenderTarget* rt, const GrClip& clip, diff --git a/src/gpu/GrBitmapTextContext.h b/src/gpu/GrBitmapTextContext.h index e389f81480..2c5c0e43cb 100644 --- a/src/gpu/GrBitmapTextContext.h +++ b/src/gpu/GrBitmapTextContext.h @@ -39,16 +39,17 @@ private: GrBitmapTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&); - bool canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) SK_OVERRIDE; - - virtual void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, const char text[], size_t byteLength, - SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; - virtual void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - const SkScalar pos[], int scalarsPerPosition, - const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; + bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, + const SkPaint&, const SkMatrix& viewMatrix) SK_OVERRIDE; + + void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, const char text[], size_t byteLength, + SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; + void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; void init(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, const SkIRect& regionClipBounds); diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp index 9ab228be81..f0915a7555 100755 --- a/src/gpu/GrDistanceFieldTextContext.cpp +++ b/src/gpu/GrDistanceFieldTextContext.cpp @@ -83,34 +83,38 @@ GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { SkSafeSetNull(fGammaTexture); } -bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) { +bool GrDistanceFieldTextContext::canDraw(const GrRenderTarget* rt, + const GrClip& clip, + const GrPaint& paint, + const SkPaint& skPaint, + const SkMatrix& viewMatrix) { // TODO: support perspective (need getMaxScale replacement) if (viewMatrix.hasPerspective()) { return false; } SkScalar maxScale = viewMatrix.getMaxScale(); - SkScalar scaledTextSize = maxScale*paint.getTextSize(); + SkScalar scaledTextSize = maxScale*skPaint.getTextSize(); // Hinted text looks far better at small resolutions // Scaling up beyond 2x yields undesireable artifacts if (scaledTextSize < kMinDFFontSize || scaledTextSize > 2*kLargeDFFontSize) { return false; } - if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP() && + if (!fEnableDFRendering && !skPaint.isDistanceFieldTextTEMP() && scaledTextSize < kLargeDFFontSize) { return false; } // rasterizers and mask filters modify alpha, which doesn't // translate well to distance - if (paint.getRasterizer() || paint.getMaskFilter() || + if (skPaint.getRasterizer() || skPaint.getMaskFilter() || !fContext->getTextTarget()->caps()->shaderDerivativeSupport()) { return false; } // TODO: add some stroking support - if (paint.getStyle() != SkPaint::kFill_Style) { + if (skPaint.getStyle() != SkPaint::kFill_Style) { return false; } diff --git a/src/gpu/GrDistanceFieldTextContext.h b/src/gpu/GrDistanceFieldTextContext.h index 3fe44888ce..5dea62c80f 100644 --- a/src/gpu/GrDistanceFieldTextContext.h +++ b/src/gpu/GrDistanceFieldTextContext.h @@ -51,17 +51,18 @@ private: GrDistanceFieldTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&, bool enable); - bool canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) SK_OVERRIDE; + bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, + const SkPaint&, const SkMatrix& viewMatrix) SK_OVERRIDE; - virtual void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; - virtual void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - const SkScalar pos[], int scalarsPerPosition, - const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; + void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; + void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; void init(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, const SkIRect& regionClipBounds); diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp index db41c02239..172a856eb1 100644 --- a/src/gpu/GrStencilAndCoverTextContext.cpp +++ b/src/gpu/GrStencilAndCoverTextContext.cpp @@ -42,27 +42,31 @@ GrStencilAndCoverTextContext::Create(GrContext* context, SkGpuDevice* gpuDevice, GrStencilAndCoverTextContext::~GrStencilAndCoverTextContext() { } -bool GrStencilAndCoverTextContext::canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) { - if (paint.getRasterizer()) { +bool GrStencilAndCoverTextContext::canDraw(const GrRenderTarget* rt, + const GrClip& clip, + const GrPaint& paint, + const SkPaint& skPaint, + const SkMatrix& viewMatrix) { + if (skPaint.getRasterizer()) { return false; } - if (paint.getMaskFilter()) { + if (skPaint.getMaskFilter()) { return false; } - if (paint.getPathEffect()) { + if (skPaint.getPathEffect()) { return false; } // No hairlines unless we can map the 1 px width to the object space. - if (paint.getStyle() == SkPaint::kStroke_Style - && paint.getStrokeWidth() == 0 + if (skPaint.getStyle() == SkPaint::kStroke_Style + && skPaint.getStrokeWidth() == 0 && viewMatrix.hasPerspective()) { return false; } // No color bitmap fonts. SkScalerContext::Rec rec; - SkScalerContext::MakeRec(paint, &fDeviceProperties, NULL, &rec); + SkScalerContext::MakeRec(skPaint, &fDeviceProperties, NULL, &rec); return rec.getFormat() != SkMask::kARGB32_Format; } diff --git a/src/gpu/GrStencilAndCoverTextContext.h b/src/gpu/GrStencilAndCoverTextContext.h index e42989b90f..37498b7e07 100644 --- a/src/gpu/GrStencilAndCoverTextContext.h +++ b/src/gpu/GrStencilAndCoverTextContext.h @@ -70,17 +70,18 @@ private: GrStencilAndCoverTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&); - bool canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) SK_OVERRIDE; + bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, + const SkPaint&, const SkMatrix& viewMatrix) SK_OVERRIDE; - virtual void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; - virtual void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, - const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - const SkScalar pos[], int scalarsPerPosition, - const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; + void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + SkScalar x, SkScalar y, const SkIRect& regionClipBounds) SK_OVERRIDE; + void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, + const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkIRect& regionClipBounds) SK_OVERRIDE; void init(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, size_t textByteLength, RenderMode, const SkMatrix& viewMatrix, diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp index d4c01719b7..32187109f3 100644 --- a/src/gpu/GrTextContext.cpp +++ b/src/gpu/GrTextContext.cpp @@ -57,7 +57,7 @@ void GrTextContext::drawText(GrRenderTarget* rt, const GrClip& clip, const GrPai GrTextContext* textContext = this; do { - if (textContext->canDraw(skPaint, viewMatrix)) { + if (textContext->canDraw(rt, clip, paint, skPaint, viewMatrix)) { textContext->onDrawText(rt, clip, paint, skPaint, viewMatrix, text, byteLength, x, y, clipBounds); return; @@ -80,7 +80,7 @@ void GrTextContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const Gr GrTextContext* textContext = this; do { - if (textContext->canDraw(skPaint, viewMatrix)) { + if (textContext->canDraw(rt, clip, paint, skPaint, viewMatrix)) { textContext->onDrawPosText(rt, clip, paint, skPaint, viewMatrix, text, byteLength, pos, scalarsPerPosition, offset, clipBounds); return; @@ -97,19 +97,49 @@ void GrTextContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const S const SkMatrix& viewMatrix, const SkTextBlob* blob, SkScalar x, SkScalar y, SkDrawFilter* drawFilter, const SkIRect& clipBounds) { - if (!fContext->getTextTarget()) { - return; - } + SkPaint runPaint = skPaint; - GrTextContext* textContext = this; - do { - if (textContext->canDraw(skPaint, viewMatrix)) { - textContext->onDrawTextBlob(rt, clip, skPaint, viewMatrix, blob, x, y, drawFilter, - clipBounds); - return; + SkTextBlob::RunIterator it(blob); + for (;!it.done(); it.next()) { + size_t textLen = it.glyphCount() * sizeof(uint16_t); + const SkPoint& offset = it.offset(); + // applyFontToPaint() always overwrites the exact same attributes, + // so it is safe to not re-seed the paint for this reason. + it.applyFontToPaint(&runPaint); + + if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) { + // A false return from filter() means we should abort the current draw. + runPaint = skPaint; + continue; } - textContext = textContext->fFallbackTextContext; - } while (textContext); + + runPaint.setFlags(fGpuDevice->filterTextFlags(runPaint)); + + GrPaint grPaint; + SkPaint2GrPaintShader(fContext, fRenderTarget, runPaint, viewMatrix, true, &grPaint); + + switch (it.positioning()) { + case SkTextBlob::kDefault_Positioning: + this->drawText(rt, clip, grPaint, runPaint, viewMatrix, (const char *)it.glyphs(), + textLen, x + offset.x(), y + offset.y(), clipBounds); + break; + case SkTextBlob::kHorizontal_Positioning: + this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), + textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), clipBounds); + break; + case SkTextBlob::kFull_Positioning: + this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), + textLen, it.pos(), 2, SkPoint::Make(x, y), clipBounds); + break; + default: + SkFAIL("unhandled positioning mode"); + } + + if (drawFilter) { + // A draw filter may change the paint arbitrarily, so we must re-seed in this case. + runPaint = skPaint; + } + } } void GrTextContext::drawTextAsPath(const SkPaint& skPaint, const SkMatrix& viewMatrix, @@ -180,55 +210,6 @@ void GrTextContext::drawPosTextAsPath(const SkPaint& origPaint, const SkMatrix& } } -void GrTextContext::onDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, - const SkPaint& skPaint, const SkMatrix& viewMatrix, - const SkTextBlob* blob, SkScalar x, SkScalar y, - SkDrawFilter* drawFilter, const SkIRect& clipBounds) { - SkPaint runPaint = skPaint; - - SkTextBlob::RunIterator it(blob); - for (;!it.done(); it.next()) { - size_t textLen = it.glyphCount() * sizeof(uint16_t); - const SkPoint& offset = it.offset(); - // applyFontToPaint() always overwrites the exact same attributes, - // so it is safe to not re-seed the paint for this reason. - it.applyFontToPaint(&runPaint); - - if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) { - // A false return from filter() means we should abort the current draw. - runPaint = skPaint; - continue; - } - - runPaint.setFlags(fGpuDevice->filterTextFlags(runPaint)); - - GrPaint grPaint; - SkPaint2GrPaintShader(fContext, fRenderTarget, runPaint, viewMatrix, true, &grPaint); - - switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: - this->drawText(rt, clip, grPaint, runPaint, viewMatrix, (const char *)it.glyphs(), - textLen, x + offset.x(), y + offset.y(), clipBounds); - break; - case SkTextBlob::kHorizontal_Positioning: - this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), - textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), clipBounds); - break; - case SkTextBlob::kFull_Positioning: - this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), - textLen, it.pos(), 2, SkPoint::Make(x, y), clipBounds); - break; - default: - SkFAIL("unhandled positioning mode"); - } - - if (drawFilter) { - // A draw filter may change the paint arbitrarily, so we must re-seed in this case. - runPaint = skPaint; - } - } -} - //*** change to output positions? int GrTextContext::MeasureText(SkGlyphCache* cache, SkDrawCacheProc glyphCacheProc, const char text[], size_t byteLength, SkVector* stopVector) { diff --git a/src/gpu/GrTextContext.h b/src/gpu/GrTextContext.h index 6dfd8601fb..0a4beae5ff 100644 --- a/src/gpu/GrTextContext.h +++ b/src/gpu/GrTextContext.h @@ -62,7 +62,8 @@ protected: GrTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&); - virtual bool canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) = 0; + virtual bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, + const SkPaint&, const SkMatrix& viewMatrix) = 0; virtual void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, const SkMatrix& viewMatrix, const char text[], size_t byteLength, @@ -72,9 +73,6 @@ protected: const char text[], size_t byteLength, const SkScalar pos[], int scalarsPerPosition, const SkPoint& offset, const SkIRect& clipBounds) = 0; - virtual void onDrawTextBlob(GrRenderTarget*, const GrClip&, const SkPaint&, - const SkMatrix& viewMatrix, const SkTextBlob*, - SkScalar x, SkScalar y, SkDrawFilter*, const SkIRect& clipBounds); void drawTextAsPath(const SkPaint& origPaint, const SkMatrix& viewMatrix, const char text[], size_t byteLength, SkScalar x, SkScalar y, |