| Index: src/core/SkDevice.cpp
|
| diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
|
| index 0ff094d73bdc74801d17cff3d0b7ae31cc6a16c7..3a4090e2d37116cf20e2804aa3d88ccbdffe1f94 100644
|
| --- a/src/core/SkDevice.cpp
|
| +++ b/src/core/SkDevice.cpp
|
| @@ -88,11 +88,11 @@ void SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| void SkBaseDevice::drawPatch(const SkDraw& draw, const SkPoint cubics[12], const SkColor colors[4],
|
| const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
|
| SkPatchUtils::VertexData data;
|
| -
|
| +
|
| SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, draw.fMatrix);
|
|
|
| // It automatically adjusts lodX and lodY in case it exceeds the number of indices.
|
| - // If it fails to generate the vertices, then we do not draw.
|
| + // If it fails to generate the vertices, then we do not draw.
|
| if (SkPatchUtils::getVertexData(&data, cubics, colors, texCoords, lod.width(), lod.height())) {
|
| this->drawVertices(draw, SkCanvas::kTriangles_VertexMode, data.fVertexCount, data.fPoints,
|
| data.fTexCoords, data.fColors, xmode, data.fIndices, data.fIndexCount,
|
| @@ -176,7 +176,7 @@ void SkBaseDevice::drawImageNine(const SkDraw& draw, const SkImage* image, const
|
| void SkBaseDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center,
|
| const SkRect& dst, const SkPaint& paint) {
|
| SkNinePatchIter iter(bitmap.width(), bitmap.height(), center, dst);
|
| -
|
| +
|
| SkRect srcR, dstR;
|
| while (iter.next(&srcR, &dstR)) {
|
| this->drawBitmapRect(draw, bitmap, &srcR, dstR, paint, SkCanvas::kStrict_SrcRectConstraint);
|
| @@ -192,7 +192,7 @@ void SkBaseDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkR
|
| for (int i = 0; i < count; ++i) {
|
| SkPoint quad[4];
|
| xform[i].toQuad(tex[i].width(), tex[i].height(), quad);
|
| -
|
| +
|
| SkMatrix localM;
|
| localM.setRSXform(xform[i]);
|
| localM.preTranslate(-tex[i].left(), -tex[i].top());
|
| @@ -209,7 +209,7 @@ void SkBaseDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkR
|
| if (colors) {
|
| pnt.setColorFilter(SkColorFilter::MakeModeFilter(colors[i], mode));
|
| }
|
| -
|
| +
|
| path.rewind();
|
| path.addPoly(quad, 4, true);
|
| path.setConvexity(SkPath::kConvex_Convexity);
|
| @@ -283,24 +283,24 @@ bool SkBaseDevice::peekPixels(SkPixmap* pmap) {
|
| static void morphpoints(SkPoint dst[], const SkPoint src[], int count,
|
| SkPathMeasure& meas, const SkMatrix& matrix) {
|
| SkMatrix::MapXYProc proc = matrix.getMapXYProc();
|
| -
|
| +
|
| for (int i = 0; i < count; i++) {
|
| SkPoint pos;
|
| SkVector tangent;
|
| -
|
| +
|
| proc(matrix, src[i].fX, src[i].fY, &pos);
|
| SkScalar sx = pos.fX;
|
| SkScalar sy = pos.fY;
|
| -
|
| +
|
| if (!meas.getPosTan(sx, &pos, &tangent)) {
|
| // set to 0 if the measure failed, so that we just set dst == pos
|
| tangent.set(0, 0);
|
| }
|
| -
|
| +
|
| /* This is the old way (that explains our approach but is way too slow
|
| SkMatrix matrix;
|
| SkPoint pt;
|
| -
|
| +
|
| pt.set(sx, sy);
|
| matrix.setSinCos(tangent.fY, tangent.fX);
|
| matrix.preTranslate(-sx, 0);
|
| @@ -313,7 +313,7 @@ static void morphpoints(SkPoint dst[], const SkPoint src[], int count,
|
| }
|
|
|
| /* TODO
|
| -
|
| +
|
| Need differentially more subdivisions when the follow-path is curvy. Not sure how to
|
| determine that, but we need it. I guess a cheap answer is let the caller tell us,
|
| but that seems like a cop-out. Another answer is to get Rob Johnson to figure it out.
|
| @@ -323,7 +323,7 @@ static void morphpath(SkPath* dst, const SkPath& src, SkPathMeasure& meas,
|
| SkPath::Iter iter(src, false);
|
| SkPoint srcP[4], dstP[3];
|
| SkPath::Verb verb;
|
| -
|
| +
|
| while ((verb = iter.next(srcP)) != SkPath::kDone_Verb) {
|
| switch (verb) {
|
| case SkPath::kMove_Verb:
|
| @@ -359,16 +359,16 @@ void SkBaseDevice::drawTextOnPath(const SkDraw& draw, const void* text, size_t b
|
| const SkPath& follow, const SkMatrix* matrix,
|
| const SkPaint& paint) {
|
| SkASSERT(byteLength == 0 || text != nullptr);
|
| -
|
| +
|
| // nothing to draw
|
| if (text == nullptr || byteLength == 0 || draw.fRC->isEmpty()) {
|
| return;
|
| }
|
| -
|
| +
|
| SkTextToPathIter iter((const char*)text, byteLength, paint, true);
|
| SkPathMeasure meas(follow, false);
|
| SkScalar hOffset = 0;
|
| -
|
| +
|
| // need to measure first
|
| if (paint.getTextAlign() != SkPaint::kLeft_Align) {
|
| SkScalar pathLen = meas.getLength();
|
| @@ -377,19 +377,19 @@ void SkBaseDevice::drawTextOnPath(const SkDraw& draw, const void* text, size_t b
|
| }
|
| hOffset += pathLen;
|
| }
|
| -
|
| +
|
| const SkPath* iterPath;
|
| SkScalar xpos;
|
| SkMatrix scaledMatrix;
|
| SkScalar scale = iter.getPathScale();
|
| -
|
| +
|
| scaledMatrix.setScale(scale, scale);
|
| -
|
| +
|
| while (iter.next(&iterPath, &xpos)) {
|
| if (iterPath) {
|
| SkPath tmp;
|
| SkMatrix m(scaledMatrix);
|
| -
|
| +
|
| tmp.setIsVolatile(true);
|
| m.postTranslate(xpos + hOffset, 0);
|
| if (matrix) {
|
|
|