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