| Index: gm/drawatlas.cpp
|
| diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp
|
| index a906cbedeba9f2a97f80dbbbeb92321afb7ce91a..ba71eaea574fe40812d9f2e1394b690ba83b7611 100644
|
| --- a/gm/drawatlas.cpp
|
| +++ b/gm/drawatlas.cpp
|
| @@ -100,3 +100,68 @@ private:
|
| typedef GM INHERITED;
|
| };
|
| DEF_GM( return new DrawAtlasGM; )
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +#include "SkPath.h"
|
| +#include "SkPathMeasure.h"
|
| +
|
| +static void draw_text_on_path_rigid(SkCanvas* canvas, const void* text, size_t length,
|
| + const SkPoint xy[], const SkPath& path, const SkPaint& paint) {
|
| + SkPathMeasure meas(path, false);
|
| +
|
| + int count = paint.countText(text, length);
|
| + SkAutoSTArray<100, SkRSXform> xform(count);
|
| +
|
| + for (int i = 0; i < count; ++i) {
|
| + SkPoint pos;
|
| + SkVector tan;
|
| + if (!meas.getPosTan(xy[i].x(), &pos, &tan)) {
|
| + pos = xy[i];
|
| + tan.set(1, 0);
|
| + }
|
| + xform[i].fSCos = tan.x();
|
| + xform[i].fSSin = tan.y();
|
| + xform[i].fTx = pos.x();
|
| + xform[i].fTy = pos.y();
|
| + }
|
| +
|
| + canvas->drawTextRSXform(text, length, &xform[0], nullptr, paint);
|
| +}
|
| +
|
| +DEF_SIMPLE_GM(drawTextRSXform, canvas, 510, 310) {
|
| + const char text[] = "ABCDFGHJKLMNOPQRSTUVWXYZ";
|
| + const int N = sizeof(text) - 1;
|
| + SkPoint pos[N];
|
| + SkRSXform xform[N];
|
| +
|
| + canvas->translate(0, 30);
|
| +
|
| + SkScalar x = 20;
|
| + SkScalar dx = 20;
|
| + SkScalar rad = 0;
|
| + SkScalar drad = 2 * SK_ScalarPI / (N - 1);
|
| + for (int i = 0; i < N; ++i) {
|
| + xform[i].fSCos = SkScalarCos(rad);
|
| + xform[i].fSSin = SkScalarSin(rad);
|
| + xform[i].fTx = x;
|
| + xform[i].fTy = 0;
|
| + pos[i].set(x, 0);
|
| + x += dx;
|
| + rad += drad;
|
| + }
|
| +
|
| + SkPaint paint;
|
| + paint.setAntiAlias(true);
|
| + paint.setTextSize(20);
|
| + canvas->drawTextRSXform(text, N, xform, nullptr, paint);
|
| +
|
| + SkPath path;
|
| + path.addOval(SkRect::MakeXYWH(150, 50, 200, 200));
|
| +
|
| + draw_text_on_path_rigid(canvas, text, N, pos, path, paint);
|
| +
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + canvas->drawPath(path, paint);
|
| +}
|
| +
|
| +
|
|
|