blob: eb8861b7d01459bd7ed063dffee85b18e49025de [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
reed@google.com8ea69832013-06-21 15:11:40 +00007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkColor.h"
11#include "include/core/SkFont.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkFontMetrics.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkFontTypes.h"
14#include "include/core/SkMatrix.h"
15#include "include/core/SkPaint.h"
16#include "include/core/SkPoint.h"
17#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
20#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "include/core/SkTypeface.h"
23#include "include/utils/SkTextUtils.h"
24#include "tools/Resources.h"
Kevin Lubickbca43ec2023-10-30 10:11:22 -040025#include "tools/fonts/FontToolUtils.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040026
27#include <stdint.h>
reed@google.com67981c52011-02-17 14:21:01 +000028
reed@google.com8ea69832013-06-21 15:11:40 +000029class Poly2PolyGM : public skiagm::GM {
reed@google.com67981c52011-02-17 14:21:01 +000030public:
rmistry@google.comd6176b02012-08-23 18:14:13 +000031 Poly2PolyGM() {}
32
reed@google.com67981c52011-02-17 14:21:01 +000033protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000034 SkString getName() const override { return SkString("poly2poly"); }
reed@google.com67981c52011-02-17 14:21:01 +000035
Leandro Lovisolo8f023882023-08-15 21:13:52 +000036 SkISize getISize() override { return SkISize::Make(835, 840); }
rmistry@google.comd6176b02012-08-23 18:14:13 +000037
Mike Reeddc5863c2018-12-23 23:19:14 -050038 static void doDraw(SkCanvas* canvas, const SkFont& font, SkPaint* paint, const int isrc[],
reed@google.com67981c52011-02-17 14:21:01 +000039 const int idst[], int count) {
40 SkMatrix matrix;
41 SkPoint src[4], dst[4];
rmistry@google.comd6176b02012-08-23 18:14:13 +000042
reed@google.com67981c52011-02-17 14:21:01 +000043 for (int i = 0; i < count; i++) {
44 src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1]));
45 dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1]));
46 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000047
reed@google.com67981c52011-02-17 14:21:01 +000048 canvas->save();
49 matrix.setPolyToPoly(src, dst, count);
50 canvas->concat(matrix);
rmistry@google.comd6176b02012-08-23 18:14:13 +000051
Mike Kleind46dce32018-08-16 10:17:03 -040052 paint->setColor(SK_ColorGRAY);
reed@google.com67981c52011-02-17 14:21:01 +000053 paint->setStyle(SkPaint::kStroke_Style);
Mike Reed3661bc92017-02-22 13:21:42 -050054 const SkScalar D = 64;
55 canvas->drawRect(SkRect::MakeWH(D, D), *paint);
reed@google.com67981c52011-02-17 14:21:01 +000056 canvas->drawLine(0, 0, D, D, *paint);
57 canvas->drawLine(0, D, D, 0, *paint);
rmistry@google.comd6176b02012-08-23 18:14:13 +000058
Mike Reedb5784ac2018-11-12 09:35:15 -050059 SkFontMetrics fm;
Mike Reeddc5863c2018-12-23 23:19:14 -050060 font.getMetrics(&fm);
reed@google.com67981c52011-02-17 14:21:01 +000061 paint->setColor(SK_ColorRED);
62 paint->setStyle(SkPaint::kFill_Style);
63 SkScalar x = D/2;
bsalomon@google.com72e49b82011-10-27 21:47:03 +000064 SkScalar y = D/2 - (fm.fAscent + fm.fDescent)/2;
caryclarkf597c422015-07-28 10:37:53 -070065 uint16_t glyphID = 3; // X
Ben Wagner51e15a62019-05-07 15:38:46 -040066 SkTextUtils::Draw(canvas, &glyphID, sizeof(glyphID), SkTextEncoding::kGlyphID, x, y,
Mike Reeddc5863c2018-12-23 23:19:14 -050067 font, *paint, SkTextUtils::kCenter_Align);
reed@google.com67981c52011-02-17 14:21:01 +000068 canvas->restore();
69 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000070
caryclarkf597c422015-07-28 10:37:53 -070071 void onOnceBeforeDraw() override {
Kevin Lubick1e971192023-11-10 16:14:44 -050072 fEmFace = ToolUtils::CreateTypefaceFromResource("fonts/Em.ttf");
Kevin Lubickbca43ec2023-10-30 10:11:22 -040073 if (!fEmFace) {
74 fEmFace = ToolUtils::DefaultPortableTypeface();
75 }
caryclarkf597c422015-07-28 10:37:53 -070076 }
77
mtklein36352bf2015-03-25 18:17:31 -070078 void onDraw(SkCanvas* canvas) override {
reed@google.com67981c52011-02-17 14:21:01 +000079 SkPaint paint;
80 paint.setAntiAlias(true);
81 paint.setStrokeWidth(SkIntToScalar(4));
Mike Reeddc5863c2018-12-23 23:19:14 -050082 SkFont font(fEmFace, 40);
rmistry@google.comd6176b02012-08-23 18:14:13 +000083
reed@google.com67981c52011-02-17 14:21:01 +000084 canvas->save();
85 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
86 // translate (1 point)
87 const int src1[] = { 0, 0 };
88 const int dst1[] = { 5, 5 };
Mike Reeddc5863c2018-12-23 23:19:14 -050089 doDraw(canvas, font, &paint, src1, dst1, 1);
reed@google.com67981c52011-02-17 14:21:01 +000090 canvas->restore();
rmistry@google.comd6176b02012-08-23 18:14:13 +000091
reed@google.com67981c52011-02-17 14:21:01 +000092 canvas->save();
93 canvas->translate(SkIntToScalar(160), SkIntToScalar(10));
94 // rotate/uniform-scale (2 points)
95 const int src2[] = { 32, 32, 64, 32 };
96 const int dst2[] = { 32, 32, 64, 48 };
Mike Reeddc5863c2018-12-23 23:19:14 -050097 doDraw(canvas, font, &paint, src2, dst2, 2);
reed@google.com67981c52011-02-17 14:21:01 +000098 canvas->restore();
rmistry@google.comd6176b02012-08-23 18:14:13 +000099
reed@google.com67981c52011-02-17 14:21:01 +0000100 canvas->save();
101 canvas->translate(SkIntToScalar(10), SkIntToScalar(110));
102 // rotate/skew (3 points)
103 const int src3[] = { 0, 0, 64, 0, 0, 64 };
104 const int dst3[] = { 0, 0, 96, 0, 24, 64 };
Mike Reeddc5863c2018-12-23 23:19:14 -0500105 doDraw(canvas, font, &paint, src3, dst3, 3);
reed@google.com67981c52011-02-17 14:21:01 +0000106 canvas->restore();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000107
reed@google.com67981c52011-02-17 14:21:01 +0000108 canvas->save();
109 canvas->translate(SkIntToScalar(160), SkIntToScalar(110));
110 // perspective (4 points)
111 const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 };
112 const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 };
Mike Reeddc5863c2018-12-23 23:19:14 -0500113 doDraw(canvas, font, &paint, src4, dst4, 4);
reed@google.com67981c52011-02-17 14:21:01 +0000114 canvas->restore();
115 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000116
reed@google.com67981c52011-02-17 14:21:01 +0000117private:
John Stiles7571f9e2020-09-02 22:42:33 -0400118 using INHERITED = skiagm::GM;
bungeman13b9c952016-05-12 10:09:30 -0700119 sk_sp<SkTypeface> fEmFace;
reed@google.com67981c52011-02-17 14:21:01 +0000120};
121
122//////////////////////////////////////////////////////////////////////////////
123
reed@google.com8ea69832013-06-21 15:11:40 +0000124DEF_GM( return new Poly2PolyGM; )