1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h" 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comextern bool SkSetPoly3To3(SkMatrix* matrix, const SkPoint src[3], const SkPoint dst[3]); 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 180faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comclass PolyToPolyView : public SampleView { 1967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.compublic: 20ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com PolyToPolyView() { 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // tests 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2364cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org SkPoint src[] = { { 0, 0 }, 2464cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SK_Scalar1, 0 }, 2564cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { 0, SK_Scalar1 } }; 2664cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org SkPoint dst[] = { { 0, 0 }, 2764cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { 2*SK_Scalar1, 0 }, 2864cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { 0, 2*SK_Scalar1 } }; 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix m1, m2; 3067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 31efbe8e9bedda21a3e061ebf3d96431a0f250a654djsollen@google.com (void) m1.setPolyToPoly(src, dst, 3); 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com m2.reset(); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMScaleX, dst[1].fX - dst[0].fX); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMSkewX, dst[2].fX - dst[0].fX); 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMTransX, dst[0].fX); 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMSkewY, dst[1].fY - dst[0].fY); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMScaleY, dst[2].fY - dst[0].fY); 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m2.set(SkMatrix::kMTransY, dst[0].fY); 4067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m1.reset(); 4267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkScalar src1[] = { 444b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 0, 0, 0, 427, 316, 427, 316, 0 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkScalar dst1[] = { 474b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 158, 177.5f, 158, 249.5f, 484b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 158, 604.5f, 158, -177.5f 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 5067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 51efbe8e9bedda21a3e061ebf3d96431a0f250a654djsollen@google.com (void) m2.setPolyToPoly((const SkPoint*)src1, (SkPoint*)dst1, 4); 5267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkPoint src[] = { 5564cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(1), SkIntToScalar(0) }, 5664cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(4), SkIntToScalar(7) }, 5764cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(10), SkIntToScalar(2) } 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkPoint dst[] = { 6064cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(4), SkIntToScalar(2) }, 6164cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(45), SkIntToScalar(26) }, 6264cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org { SkIntToScalar(32), SkIntToScalar(17) } 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 6467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 65820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com SkMatrix m0; 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m0.setPolyToPoly(src, dst, 3); 67820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com // SkMatrix m1; 6867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com // SkSetPoly3To3(&m1, src, dst); 692f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com // m0.dump(); 702f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com // m1.dump(); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 7467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onQuery(SkEvent* evt) { 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) { 7945369a33bb78b6b76fafd63b1334151368dc9e2atfarina@chromium.org SampleCode::TitleR(evt, "PolyToPolyView"); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 8467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[], 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int idst[], int count) { 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix matrix; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPoint src[4], dst[4]; 8967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = 0; i < count; i++) { 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1])); 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1])); 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 9467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.setPolyToPoly(src, dst, count); 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->concat(matrix); 9867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setColor(SK_ColorGRAY); 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setStyle(SkPaint::kStroke_Style); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkScalar D = SkIntToScalar(64); 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawRectCoords(0, 0, D, D, *paint); 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawLine(0, 0, D, D, *paint); 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawLine(0, D, D, 0, *paint); 10567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint::FontMetrics fm; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->getFontMetrics(&fm); 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setColor(SK_ColorRED); 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setStyle(SkPaint::kFill_Style); 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar x = D/2; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com float y = D/2 - (fm.fAscent + fm.fDescent)/2; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString str; 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com str.appendS32(count); 114c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com canvas->drawText(str.c_str(), str.size(), 1154b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org x, y, 116c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com *paint); 11767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 12067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1210faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com virtual void onDrawContent(SkCanvas* canvas) { 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStrokeWidth(SkIntToScalar(4)); 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextSize(SkIntToScalar(40)); 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextAlign(SkPaint::kCenter_Align); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // translate (1 point) 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int src1[] = { 0, 0 }; 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int dst1[] = { 5, 5 }; 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com doDraw(canvas, &paint, src1, dst1, 1); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 13567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(160), SkIntToScalar(10)); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // rotate/uniform-scale (2 points) 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int src2[] = { 32, 32, 64, 32 }; 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int dst2[] = { 32, 32, 64, 48 }; 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com doDraw(canvas, &paint, src2, dst2, 2); 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 14367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(10), SkIntToScalar(110)); 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // rotate/skew (3 points) 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int src3[] = { 0, 0, 64, 0, 0, 64 }; 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int dst3[] = { 0, 0, 96, 0, 24, 64 }; 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com doDraw(canvas, &paint, src3, dst3, 3); 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 15167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(160), SkIntToScalar(110)); 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // perspective (4 points) 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 }; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 }; 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com doDraw(canvas, &paint, src4, dst4, 4); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 16067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1620faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com typedef SampleView INHERITED; 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new PolyToPolyView; } 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 169