1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkFontMetrics.h" 10cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 12cb93a386Sopenharmony_ci#include "include/core/SkString.h" 13cb93a386Sopenharmony_ci#include "include/core/SkTime.h" 14cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 15cb93a386Sopenharmony_ci#include "include/utils/SkTextUtils.h" 16cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass PolyToPolyView : public Sample { 19cb93a386Sopenharmony_cipublic: 20cb93a386Sopenharmony_ci PolyToPolyView() { 21cb93a386Sopenharmony_ci // tests 22cb93a386Sopenharmony_ci { 23cb93a386Sopenharmony_ci SkPoint src[] = { { 0, 0 }, 24cb93a386Sopenharmony_ci { SK_Scalar1, 0 }, 25cb93a386Sopenharmony_ci { 0, SK_Scalar1 } }; 26cb93a386Sopenharmony_ci SkPoint dst[] = { { 0, 0 }, 27cb93a386Sopenharmony_ci { 2*SK_Scalar1, 0 }, 28cb93a386Sopenharmony_ci { 0, 2*SK_Scalar1 } }; 29cb93a386Sopenharmony_ci SkMatrix m1, m2; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci (void) m1.setPolyToPoly(src, dst, 3); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci m2.reset(); 34cb93a386Sopenharmony_ci m2.set(SkMatrix::kMScaleX, dst[1].fX - dst[0].fX); 35cb93a386Sopenharmony_ci m2.set(SkMatrix::kMSkewX, dst[2].fX - dst[0].fX); 36cb93a386Sopenharmony_ci m2.set(SkMatrix::kMTransX, dst[0].fX); 37cb93a386Sopenharmony_ci m2.set(SkMatrix::kMSkewY, dst[1].fY - dst[0].fY); 38cb93a386Sopenharmony_ci m2.set(SkMatrix::kMScaleY, dst[2].fY - dst[0].fY); 39cb93a386Sopenharmony_ci m2.set(SkMatrix::kMTransY, dst[0].fY); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci m1.reset(); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci const SkScalar src1[] = { 44cb93a386Sopenharmony_ci 0, 0, 0, 427, 316, 427, 316, 0 45cb93a386Sopenharmony_ci }; 46cb93a386Sopenharmony_ci const SkScalar dst1[] = { 47cb93a386Sopenharmony_ci 158, 177.5f, 158, 249.5f, 48cb93a386Sopenharmony_ci 158, 604.5f, 158, -177.5f 49cb93a386Sopenharmony_ci }; 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci (void) m2.setPolyToPoly((const SkPoint*)src1, (SkPoint*)dst1, 4); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci const SkPoint src2[] = { 54cb93a386Sopenharmony_ci { SkIntToScalar(1), SkIntToScalar(0) }, 55cb93a386Sopenharmony_ci { SkIntToScalar(4), SkIntToScalar(7) }, 56cb93a386Sopenharmony_ci { SkIntToScalar(10), SkIntToScalar(2) } 57cb93a386Sopenharmony_ci }; 58cb93a386Sopenharmony_ci const SkPoint dst2[] = { 59cb93a386Sopenharmony_ci { SkIntToScalar(4), SkIntToScalar(2) }, 60cb93a386Sopenharmony_ci { SkIntToScalar(45), SkIntToScalar(26) }, 61cb93a386Sopenharmony_ci { SkIntToScalar(32), SkIntToScalar(17) } 62cb93a386Sopenharmony_ci }; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkMatrix m0; 65cb93a386Sopenharmony_ci m0.setPolyToPoly(src2, dst2, 3); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ciprotected: 70cb93a386Sopenharmony_ci SkString name() override { return SkString("PolyToPolyView"); } 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci static void doDraw(SkCanvas* canvas, SkPaint* paint, const SkFont& font, const int isrc[], 73cb93a386Sopenharmony_ci const int idst[], int count) { 74cb93a386Sopenharmony_ci SkMatrix matrix; 75cb93a386Sopenharmony_ci SkPoint src[4], dst[4]; 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci for (int i = 0; i < count; i++) { 78cb93a386Sopenharmony_ci src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1])); 79cb93a386Sopenharmony_ci dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1])); 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci canvas->save(); 83cb93a386Sopenharmony_ci matrix.setPolyToPoly(src, dst, count); 84cb93a386Sopenharmony_ci canvas->concat(matrix); 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci paint->setColor(SK_ColorGRAY); 87cb93a386Sopenharmony_ci paint->setStyle(SkPaint::kStroke_Style); 88cb93a386Sopenharmony_ci const SkScalar D = SkIntToScalar(64); 89cb93a386Sopenharmony_ci canvas->drawRect(SkRect::MakeWH(D, D), *paint); 90cb93a386Sopenharmony_ci canvas->drawLine(0, 0, D, D, *paint); 91cb93a386Sopenharmony_ci canvas->drawLine(0, D, D, 0, *paint); 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci SkFontMetrics fm; 94cb93a386Sopenharmony_ci font.getMetrics(&fm); 95cb93a386Sopenharmony_ci paint->setColor(SK_ColorRED); 96cb93a386Sopenharmony_ci paint->setStyle(SkPaint::kFill_Style); 97cb93a386Sopenharmony_ci SkScalar x = D/2; 98cb93a386Sopenharmony_ci float y = D/2 - (fm.fAscent + fm.fDescent)/2; 99cb93a386Sopenharmony_ci SkString str; 100cb93a386Sopenharmony_ci str.appendS32(count); 101cb93a386Sopenharmony_ci SkTextUtils::DrawString(canvas, str.c_str(), x, y, font, *paint, SkTextUtils::kCenter_Align); 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci canvas->restore(); 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 107cb93a386Sopenharmony_ci SkPaint paint; 108cb93a386Sopenharmony_ci paint.setAntiAlias(true); 109cb93a386Sopenharmony_ci paint.setStrokeWidth(SkIntToScalar(4)); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci SkFont font; 112cb93a386Sopenharmony_ci font.setSize(40); 113cb93a386Sopenharmony_ci 114cb93a386Sopenharmony_ci canvas->save(); 115cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 116cb93a386Sopenharmony_ci // translate (1 point) 117cb93a386Sopenharmony_ci const int src1[] = { 0, 0 }; 118cb93a386Sopenharmony_ci const int dst1[] = { 5, 5 }; 119cb93a386Sopenharmony_ci doDraw(canvas, &paint, font, src1, dst1, 1); 120cb93a386Sopenharmony_ci canvas->restore(); 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci canvas->save(); 123cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(160), SkIntToScalar(10)); 124cb93a386Sopenharmony_ci // rotate/uniform-scale (2 points) 125cb93a386Sopenharmony_ci const int src2[] = { 32, 32, 64, 32 }; 126cb93a386Sopenharmony_ci const int dst2[] = { 32, 32, 64, 48 }; 127cb93a386Sopenharmony_ci doDraw(canvas, &paint, font, src2, dst2, 2); 128cb93a386Sopenharmony_ci canvas->restore(); 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci canvas->save(); 131cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(10), SkIntToScalar(110)); 132cb93a386Sopenharmony_ci // rotate/skew (3 points) 133cb93a386Sopenharmony_ci const int src3[] = { 0, 0, 64, 0, 0, 64 }; 134cb93a386Sopenharmony_ci const int dst3[] = { 0, 0, 96, 0, 24, 64 }; 135cb93a386Sopenharmony_ci doDraw(canvas, &paint, font, src3, dst3, 3); 136cb93a386Sopenharmony_ci canvas->restore(); 137cb93a386Sopenharmony_ci 138cb93a386Sopenharmony_ci canvas->save(); 139cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(160), SkIntToScalar(110)); 140cb93a386Sopenharmony_ci // perspective (4 points) 141cb93a386Sopenharmony_ci const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 }; 142cb93a386Sopenharmony_ci const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 }; 143cb93a386Sopenharmony_ci doDraw(canvas, &paint, font, src4, dst4, 4); 144cb93a386Sopenharmony_ci canvas->restore(); 145cb93a386Sopenharmony_ci } 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ciprivate: 148cb93a386Sopenharmony_ci using INHERITED = Sample; 149cb93a386Sopenharmony_ci}; 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ciDEF_SAMPLE( return new PolyToPolyView(); ) 154