diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBitmapDevice.cpp | 6 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 9 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 30 | ||||
-rw-r--r-- | src/core/SkDraw.cpp | 16 | ||||
-rw-r--r-- | src/core/SkTextMapStateProc.h | 26 | ||||
-rw-r--r-- | src/device/xps/SkXPSDevice.cpp | 9 | ||||
-rwxr-xr-x | src/gpu/GrBitmapTextContext.cpp | 6 | ||||
-rw-r--r-- | src/gpu/GrBitmapTextContext.h | 4 | ||||
-rwxr-xr-x | src/gpu/GrDistanceFieldTextContext.cpp | 12 | ||||
-rw-r--r-- | src/gpu/GrDistanceFieldTextContext.h | 4 | ||||
-rw-r--r-- | src/gpu/GrStencilAndCoverTextContext.cpp | 17 | ||||
-rw-r--r-- | src/gpu/GrStencilAndCoverTextContext.h | 6 | ||||
-rw-r--r-- | src/gpu/GrTextContext.h | 4 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 14 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 4 | ||||
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 9 | ||||
-rw-r--r-- | src/pdf/SkPDFDeviceFlattener.cpp | 8 | ||||
-rw-r--r-- | src/pdf/SkPDFDeviceFlattener.h | 4 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 4 | ||||
-rw-r--r-- | src/utils/SkGatherPixelRefsAndRects.h | 19 | ||||
-rw-r--r-- | src/utils/SkPictureUtils.cpp | 4 |
21 files changed, 96 insertions, 119 deletions
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index b48432efa0..cc4155a29f 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -329,9 +329,9 @@ void SkBitmapDevice::drawText(const SkDraw& draw, const void* text, size_t len, } void SkBitmapDevice::drawPosText(const SkDraw& draw, const void* text, size_t len, - const SkScalar xpos[], SkScalar y, - int scalarsPerPos, const SkPaint& paint) { - draw.drawPosText((const char*)text, len, xpos, y, scalarsPerPos, paint); + const SkScalar xpos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) { + draw.drawPosText((const char*)text, len, xpos, scalarsPerPos, offset, paint); } void SkBitmapDevice::drawTextOnPath(const SkDraw& draw, const void* text, diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index d43d5a46d3..065aecdd95 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -2152,11 +2152,13 @@ void SkCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkSca void SkCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint) { + SkPoint textOffset = SkPoint::Make(0, 0); + LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) while (iter.next()) { SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); - iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 0, 2, + iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 2, textOffset, dfp.paint()); } @@ -2165,11 +2167,14 @@ void SkCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint void SkCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { + + SkPoint textOffset = SkPoint::Make(0, constY); + LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) while (iter.next()) { SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); - iter.fDevice->drawPosText(iter, text, byteLength, xpos, constY, 1, + iter.fDevice->drawPosText(iter, text, byteLength, xpos, 1, textOffset, dfp.paint()); } diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 63a7633648..935d489892 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -96,27 +96,6 @@ void SkBaseDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSc const SkPaint &paint) { SkPaint runPaint = paint; - SkMatrix localMatrix; - SkDraw localDraw(draw); - - if (x || y) { - localMatrix = *draw.fMatrix; - localMatrix.preTranslate(x, y); - localDraw.fMatrix = &localMatrix; - - if (paint.getShader()) { - // FIXME: We need to compensate for the translate above. This is suboptimal but - // temporary -- until we get proper derived class drawTextBlob implementations. - - // TODO: pass x,y down to the other methods so they can handle the additional - // translate without needing to allocate a new shader. - SkMatrix shaderMatrix; - shaderMatrix.setTranslate(-x, -y); - SkAutoTUnref<SkShader> wrapper( - SkShader::CreateLocalMatrixShader(paint.getShader(), shaderMatrix)); - runPaint.setShader(wrapper); - } - } SkTextBlob::RunIterator it(blob); while (!it.done()) { @@ -128,12 +107,15 @@ void SkBaseDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSc switch (it.positioning()) { case SkTextBlob::kDefault_Positioning: - this->drawText(localDraw, it.glyphs(), textLen, offset.x(), offset.y(), runPaint); + this->drawText(draw, it.glyphs(), textLen, x + offset.x(), y + offset.y(), runPaint); break; case SkTextBlob::kHorizontal_Positioning: + this->drawPosText(draw, it.glyphs(), textLen, it.pos(), 1, + SkPoint::Make(x, y + offset.y()), runPaint); + break; case SkTextBlob::kFull_Positioning: - this->drawPosText(localDraw, it.glyphs(), textLen, it.pos(), offset.y(), - SkTextBlob::ScalarsPerGlyph(it.positioning()), runPaint); + this->drawPosText(draw, it.glyphs(), textLen, it.pos(), 2, + SkPoint::Make(x, y), runPaint); break; default: SkFAIL("unhandled positioning mode"); diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index e905f4b9f5..929088df17 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -1655,9 +1655,8 @@ void SkDraw::drawText(const char text[], size_t byteLength, ////////////////////////////////////////////////////////////////////////////// void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition, - const SkPaint& origPaint) const { + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkPaint& origPaint) const { // setup our std paint, in hopes of getting hits in the cache SkPaint paint(origPaint); SkScalar matrixScale = paint.setupForAsPaths(); @@ -1675,7 +1674,7 @@ void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, const char* stop = text + byteLength; SkTextAlignProcScalar alignProc(paint.getTextAlign()); - SkTextMapStateProc tmsProc(SkMatrix::I(), constY, scalarsPerPosition); + SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition); // Now restore the original settings, so we "draw" with whatever style/stroking. paint.setStyle(origPaint.getStyle()); @@ -1705,8 +1704,8 @@ void SkDraw::drawPosText_asPaths(const char text[], size_t byteLength, } void SkDraw::drawPosText(const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition, const SkPaint& paint) const { + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkPaint& paint) const { SkASSERT(byteLength == 0 || text != NULL); SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); @@ -1718,8 +1717,7 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, } if (ShouldDrawTextAsPaths(paint, *fMatrix)) { - this->drawPosText_asPaths(text, byteLength, pos, constY, - scalarsPerPosition, paint); + this->drawPosText_asPaths(text, byteLength, pos, scalarsPerPosition, offset, paint); return; } @@ -1743,7 +1741,7 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, SkTextAlignProc alignProc(paint.getTextAlign()); SkDraw1Glyph d1g; SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint); - SkTextMapStateProc tmsProc(*fMatrix, constY, scalarsPerPosition); + SkTextMapStateProc tmsProc(*fMatrix, offset, scalarsPerPosition); if (cache->isSubpixel()) { // maybe we should skip the rounding if linearText is set diff --git a/src/core/SkTextMapStateProc.h b/src/core/SkTextMapStateProc.h index 5a8dcaa3b1..8ef9389b3a 100644 --- a/src/core/SkTextMapStateProc.h +++ b/src/core/SkTextMapStateProc.h @@ -13,20 +13,22 @@ class SkTextMapStateProc { public: - SkTextMapStateProc(const SkMatrix& matrix, SkScalar y, int scalarsPerPosition) + SkTextMapStateProc(const SkMatrix& matrix, const SkPoint& offset, int scalarsPerPosition) : fMatrix(matrix) , fProc(matrix.getMapXYProc()) - , fY(y) - , fScaleX(fMatrix.getScaleX()) - , fTransX(fMatrix.getTranslateX()) { + , fOffset(offset) + , fScaleX(fMatrix.getScaleX()) { SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); if (1 == scalarsPerPosition) { unsigned mtype = fMatrix.getType(); if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { fMapCase = kX; } else { - fY = SkScalarMul(y, fMatrix.getScaleY()) + - fMatrix.getTranslateY(); + // Bake the matrix scale/translation components into fOffset, + // to expedite proc computations. + fOffset.set(SkScalarMul(offset.x(), fMatrix.getScaleX()) + fMatrix.getTranslateX(), + SkScalarMul(offset.y(), fMatrix.getScaleY()) + fMatrix.getTranslateY()); + if (mtype & SkMatrix::kScale_Mask) { fMapCase = kOnlyScaleX; } else { @@ -49,25 +51,25 @@ private: kX } fMapCase; const SkMatrix::MapXYProc fProc; - SkScalar fY; // Ignored by kXY case. - SkScalar fScaleX, fTransX; // These are only used by Only... cases. + SkPoint fOffset; // In kOnly* mode, this includes the matrix translation component. + SkScalar fScaleX; // This is only used by kOnly... cases. }; inline void SkTextMapStateProc::operator()(const SkScalar pos[], SkPoint* loc) const { switch(fMapCase) { case kXY: - fProc(fMatrix, pos[0], pos[1], loc); + fProc(fMatrix, pos[0] + fOffset.x(), pos[1] + fOffset.y(), loc); break; case kOnlyScaleX: - loc->set(SkScalarMul(fScaleX, *pos) + fTransX, fY); + loc->set(SkScalarMul(fScaleX, *pos) + fOffset.x(), fOffset.y()); break; case kOnlyTransX: - loc->set(*pos + fTransX, fY); + loc->set(*pos + fOffset.x(), fOffset.y()); break; default: SkASSERT(false); case kX: - fProc(fMatrix, *pos, fY, loc); + fProc(fMatrix, *pos + fOffset.x(), fOffset.y(), loc); break; } } diff --git a/src/device/xps/SkXPSDevice.cpp b/src/device/xps/SkXPSDevice.cpp index 1a1215343a..5bf07e9877 100644 --- a/src/device/xps/SkXPSDevice.cpp +++ b/src/device/xps/SkXPSDevice.cpp @@ -2165,9 +2165,8 @@ void SkXPSDevice::drawText(const SkDraw& d, void SkXPSDevice::drawPosText(const SkDraw& d, const void* text, size_t byteLen, - const SkScalar pos[], - SkScalar constY, int scalarsPerPos, - const SkPaint& paint) { + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) { if (byteLen < 1) return; if (text_must_be_pathed(paint, *d.fMatrix)) { @@ -2187,9 +2186,7 @@ void SkXPSDevice::drawPosText(const SkDraw& d, SkXPSDrawProcs procs; text_draw_init(paint, text, byteLen, *typeface->glyphsUsed, myDraw, procs); - myDraw.drawPosText(static_cast<const char*>(text), byteLen, - pos, constY, scalarsPerPos, - paint); + myDraw.drawPosText(static_cast<const char*>(text), byteLen, pos, scalarsPerPos, offset, paint); // SkDraw may have clipped out the glyphs, so we need to check if (procs.xpsGlyphs.count() == 0) { diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp index 82784bf0e3..0f6d1b62a9 100755 --- a/src/gpu/GrBitmapTextContext.cpp +++ b/src/gpu/GrBitmapTextContext.cpp @@ -270,8 +270,8 @@ void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) { + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) { SkASSERT(byteLength == 0 || text != NULL); SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); @@ -295,7 +295,7 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai const char* stop = text + byteLength; SkTextAlignProc alignProc(fSkPaint.getTextAlign()); - SkTextMapStateProc tmsProc(ctm, constY, scalarsPerPosition); + SkTextMapStateProc tmsProc(ctm, offset, scalarsPerPosition); SkFixed halfSampleX = 0, halfSampleY = 0; if (cache->isSubpixel()) { diff --git a/src/gpu/GrBitmapTextContext.h b/src/gpu/GrBitmapTextContext.h index 80abf681f4..c136270c65 100644 --- a/src/gpu/GrBitmapTextContext.h +++ b/src/gpu/GrBitmapTextContext.h @@ -25,8 +25,8 @@ public: SkScalar x, SkScalar y) SK_OVERRIDE; virtual void drawPosText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) SK_OVERRIDE; + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) SK_OVERRIDE; virtual bool canDraw(const SkPaint& paint) SK_OVERRIDE; diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp index 9fd024af9f..e2bd6e9f9c 100755 --- a/src/gpu/GrDistanceFieldTextContext.cpp +++ b/src/gpu/GrDistanceFieldTextContext.cpp @@ -609,8 +609,8 @@ void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) { + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) { SkASSERT(byteLength == 0 || text != NULL); SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); @@ -638,8 +638,8 @@ void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); if (glyph.fWidth) { - SkScalar x = pos[0]; - SkScalar y = scalarsPerPosition == 1 ? constY : pos[1]; + SkScalar x = offset.x() + pos[0]; + SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0); this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), glyph.getSubXFixed(), @@ -657,8 +657,8 @@ void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); if (glyph.fWidth) { - SkScalar x = pos[0]; - SkScalar y = scalarsPerPosition == 1 ? constY : pos[1]; + SkScalar x = offset.x() + pos[0]; + SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0); this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), glyph.getSubXFixed(), diff --git a/src/gpu/GrDistanceFieldTextContext.h b/src/gpu/GrDistanceFieldTextContext.h index 85d9250e44..0b08b5986c 100644 --- a/src/gpu/GrDistanceFieldTextContext.h +++ b/src/gpu/GrDistanceFieldTextContext.h @@ -25,8 +25,8 @@ public: SkScalar x, SkScalar y) SK_OVERRIDE; virtual void drawPosText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) SK_OVERRIDE; + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) SK_OVERRIDE; virtual bool canDraw(const SkPaint& paint) SK_OVERRIDE; diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp index c1d9e9d32d..cfcabe923f 100644 --- a/src/gpu/GrStencilAndCoverTextContext.cpp +++ b/src/gpu/GrStencilAndCoverTextContext.cpp @@ -54,7 +54,7 @@ void GrStencilAndCoverTextContext::drawText(const GrPaint& paint, // will turn off the use of device-space glyphs when perspective transforms // are in use. - this->init(paint, skPaint, byteLength, kMaxAccuracy_RenderMode); + this->init(paint, skPaint, byteLength, kMaxAccuracy_RenderMode, SkPoint::Make(0, 0)); // Transform our starting point. if (fNeedsDeviceSpaceGlyphs) { @@ -123,8 +123,8 @@ void GrStencilAndCoverTextContext::drawPosText(const GrPaint& paint, const char text[], size_t byteLength, const SkScalar pos[], - SkScalar constY, - int scalarsPerPosition) { + int scalarsPerPosition, + const SkPoint& offset) { SkASSERT(byteLength == 0 || text != NULL); SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); @@ -141,8 +141,7 @@ void GrStencilAndCoverTextContext::drawPosText(const GrPaint& paint, // transform is not part of SkPaint::measureText API, and thus we use the // same glyphs as what were measured. - const float textTranslateY = (1 == scalarsPerPosition ? constY : 0); - this->init(paint, skPaint, byteLength, kMaxPerformance_RenderMode, textTranslateY); + this->init(paint, skPaint, byteLength, kMaxPerformance_RenderMode, offset); SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); @@ -171,7 +170,7 @@ void GrStencilAndCoverTextContext::drawPosText(const GrPaint& paint, } } else { fTransformType = GrPathRendering::kTranslate_PathTransformType; - SkTextMapStateProc tmsProc(SkMatrix::I(), 0, scalarsPerPosition); + SkTextMapStateProc tmsProc(SkMatrix::I(), SkPoint::Make(0, 0), scalarsPerPosition); SkTextAlignProcScalar alignProc(fSkPaint.getTextAlign()); while (text < stop) { const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0); @@ -242,7 +241,7 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint, const SkPaint& skPaint, size_t textByteLength, RenderMode renderMode, - SkScalar textTranslateY) { + const SkPoint& textTranslate) { GrTextContext::init(paint, skPaint); fContextInitialMatrix = fContext->getMatrix(); @@ -258,7 +257,7 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint, if (fNeedsDeviceSpaceGlyphs) { // SkDraw::ShouldDrawTextAsPaths takes care of perspective transforms. SkASSERT(!fContextInitialMatrix.hasPerspective()); - SkASSERT(0 == textTranslateY); // TODO: Handle textTranslateY in device-space usecase. + SkASSERT(textTranslate.isZero()); // TODO: Handle textTranslate in device-space usecase. fTextRatio = fTextInverseRatio = 1.0f; @@ -340,7 +339,7 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint, } SkMatrix textMatrix; - textMatrix.setTranslate(0, textTranslateY); + textMatrix.setTranslate(textTranslate.x(), textTranslate.y()); // Glyphs loaded by GPU path rendering have an inverted y-direction. textMatrix.preScale(fTextRatio, -fTextRatio); fPaint.localCoordChange(textMatrix); diff --git a/src/gpu/GrStencilAndCoverTextContext.h b/src/gpu/GrStencilAndCoverTextContext.h index 5ba4a7027b..b6e23bdb3f 100644 --- a/src/gpu/GrStencilAndCoverTextContext.h +++ b/src/gpu/GrStencilAndCoverTextContext.h @@ -32,8 +32,8 @@ public: SkScalar x, SkScalar y) SK_OVERRIDE; virtual void drawPosText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) SK_OVERRIDE; + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) SK_OVERRIDE; virtual bool canDraw(const SkPaint& paint) SK_OVERRIDE; @@ -62,7 +62,7 @@ private: }; void init(const GrPaint&, const SkPaint&, size_t textByteLength, - RenderMode, SkScalar textTranslateY = 0); + RenderMode, const SkPoint& textTranslate); void initGlyphs(SkGlyphCache* cache); void appendGlyph(uint16_t glyphID, float x); void appendGlyph(uint16_t glyphID, float x, float y); diff --git a/src/gpu/GrTextContext.h b/src/gpu/GrTextContext.h index c139e22295..da41c1bb3c 100644 --- a/src/gpu/GrTextContext.h +++ b/src/gpu/GrTextContext.h @@ -28,8 +28,8 @@ public: SkScalar x, SkScalar y) = 0; virtual void drawPosText(const GrPaint&, const SkPaint&, const char text[], size_t byteLength, - const SkScalar pos[], SkScalar constY, - int scalarsPerPosition) = 0; + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset) = 0; virtual bool canDraw(const SkPaint& paint) = 0; diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index bd075cfd97..30b3668d6b 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1713,10 +1713,9 @@ void SkGpuDevice::drawText(const SkDraw& draw, const void* text, } } -void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, - size_t byteLength, const SkScalar pos[], - SkScalar constY, int scalarsPerPos, - const SkPaint& paint) { +void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteLength, + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) { GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPosText", fContext); CHECK_SHOULD_DRAW(draw, false); @@ -1727,7 +1726,7 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, SkDEBUGCODE(this->validate();) fMainTextContext->drawPosText(grPaint, paint, (const char *)text, byteLength, pos, - constY, scalarsPerPos); + scalarsPerPos, offset); } else if (fFallbackTextContext && fFallbackTextContext->canDraw(paint)) { GrPaint grPaint; SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); @@ -1735,10 +1734,9 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, SkDEBUGCODE(this->validate();) fFallbackTextContext->drawPosText(grPaint, paint, (const char *)text, byteLength, pos, - constY, scalarsPerPos); + scalarsPerPos, offset); } else { - draw.drawPosText_asPaths((const char*)text, byteLength, pos, constY, - scalarsPerPos, paint); + draw.drawPosText_asPaths((const char*)text, byteLength, pos, scalarsPerPos, offset, paint); } } diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 41b53b1213..f19d2cb62b 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -90,8 +90,8 @@ public: virtual void drawText(const SkDraw&, const void* text, size_t len, SkScalar x, SkScalar y, const SkPaint&) SK_OVERRIDE; virtual void drawPosText(const SkDraw&, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint&) SK_OVERRIDE; + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint&) SK_OVERRIDE; virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, const SkPath& path, const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index aa6b521887..bd9b1d7f7e 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -1144,8 +1144,8 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, } void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint& paint) { + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) { NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false); if (paint.getMaskFilter() != NULL) { // Don't pretend we support drawing MaskFilters, it makes for artifacts @@ -1177,8 +1177,9 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, continue; } fFontGlyphUsage->noteGlyphUsage(font, &encodedValue, 1); - SkScalar x = pos[i * scalarsPerPos]; - SkScalar y = scalarsPerPos == 1 ? constY : pos[i * scalarsPerPos + 1]; + SkScalar x = offset.x() + pos[i * scalarsPerPos]; + SkScalar y = offset.y() + (2 == scalarsPerPos ? pos[i * scalarsPerPos + 1] : 0); + align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y); set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fContent); diff --git a/src/pdf/SkPDFDeviceFlattener.cpp b/src/pdf/SkPDFDeviceFlattener.cpp index aea87f6546..477486413a 100644 --- a/src/pdf/SkPDFDeviceFlattener.cpp +++ b/src/pdf/SkPDFDeviceFlattener.cpp @@ -123,13 +123,13 @@ void SkPDFDeviceFlattener::drawText(const SkDraw& d, const void* text, size_t le } void SkPDFDeviceFlattener::drawPosText(const SkDraw& d, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint& paint) { + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) { if (mustPathText(d, paint)) { - d.drawPosText_asPaths((const char*)text, len, pos, constY, scalarsPerPos, paint); + d.drawPosText_asPaths((const char*)text, len, pos, scalarsPerPos, offset, paint); return; } - INHERITED::drawPosText(d, text, len, pos, constY,scalarsPerPos, paint); + INHERITED::drawPosText(d, text, len, pos, scalarsPerPos, offset, paint); } void SkPDFDeviceFlattener::drawTextOnPath(const SkDraw& d, const void* text, size_t len, diff --git a/src/pdf/SkPDFDeviceFlattener.h b/src/pdf/SkPDFDeviceFlattener.h index f1047db3fc..bb15237996 100644 --- a/src/pdf/SkPDFDeviceFlattener.h +++ b/src/pdf/SkPDFDeviceFlattener.h @@ -37,8 +37,8 @@ public: virtual void drawText(const SkDraw&, const void* text, size_t len, SkScalar x, SkScalar y, const SkPaint&) SK_OVERRIDE; virtual void drawPosText(const SkDraw&, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint&) SK_OVERRIDE; + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint&) SK_OVERRIDE; virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) SK_OVERRIDE; diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index c8402dda4a..06f7bb089a 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -210,8 +210,8 @@ protected: SkScalar x, SkScalar y, const SkPaint& paint) SK_OVERRIDE {SkASSERT(0);} virtual void drawPosText(const SkDraw&, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint& paint) SK_OVERRIDE + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) SK_OVERRIDE {SkASSERT(0);} virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, const SkPath& path, diff --git a/src/utils/SkGatherPixelRefsAndRects.h b/src/utils/SkGatherPixelRefsAndRects.h index e1e5ccd92e..0a4bb5b84c 100644 --- a/src/utils/SkGatherPixelRefsAndRects.h +++ b/src/utils/SkGatherPixelRefsAndRects.h @@ -195,8 +195,8 @@ protected: this->drawRect(draw, bounds, paint); } virtual void drawPosText(const SkDraw& draw, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int scalarsPerPos, const SkPaint& paint) SK_OVERRIDE { + const SkScalar pos[], int scalarsPerPos, + const SkPoint& offset, const SkPaint& paint) SK_OVERRIDE { SkBitmap bitmap; if (!GetBitmapFromPaint(paint, &bitmap)) { return; @@ -209,18 +209,13 @@ protected: // Similar to SkDraw asserts. SkASSERT(scalarsPerPos == 1 || scalarsPerPos == 2); - SkScalar y = scalarsPerPos == 1 ? constY : constY + pos[1]; - - SkPoint min, max; - min.set(pos[0], y); - max.set(pos[0], y); + SkPoint min = SkPoint::Make(offset.x() + pos[0], + offset.y() + (2 == scalarsPerPos ? pos[1] : 0)); + SkPoint max = min; for (size_t i = 1; i < len; ++i) { - SkScalar x = pos[i * scalarsPerPos]; - SkScalar y = constY; - if (2 == scalarsPerPos) { - y += pos[i * scalarsPerPos + 1]; - } + SkScalar x = offset.x() + pos[i * scalarsPerPos]; + SkScalar y = offset.y() + (2 == scalarsPerPos ? pos[i * 2 + 1] : 0); min.set(SkMinScalar(x, min.x()), SkMinScalar(y, min.y())); max.set(SkMaxScalar(x, max.x()), SkMaxScalar(y, max.y())); diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp index 4f4d2bf30a..391e5ffc79 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -132,8 +132,8 @@ public: this->addBitmapFromPaint(paint); } virtual void drawPosText(const SkDraw&, const void* text, size_t len, - const SkScalar pos[], SkScalar constY, - int, const SkPaint& paint) SK_OVERRIDE { + const SkScalar pos[], int, + const SkPoint&, const SkPaint& paint) SK_OVERRIDE { this->addBitmapFromPaint(paint); } virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, |