1f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.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 */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkImageDecoder.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXfermode.h" 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h" 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h" 22d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com#include "SkParsePath.h" 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h" 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h" 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 26a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com#include "SkGeometry.h" 27a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com 28a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com// http://code.google.com/p/skia/issues/detail?id=32 29a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.comstatic void test_cubic() { 30a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com SkPoint src[4] = { 31261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com { 556.25000f, 523.03003f }, 32261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com { 556.23999f, 522.96002f }, 33261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com { 556.21997f, 522.89001f }, 34261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com { 556.21997f, 522.82001f } 35a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com }; 36a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com SkPoint dst[11]; 37a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com dst[10].set(42, -42); // one past the end, that we don't clobber these 38a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com SkScalar tval[] = { 0.33333334f, 0.99999994f }; 39a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com 40a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com SkChopCubicAt(src, dst, tval, 2); 41a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com 42a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com#if 0 43a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com for (int i = 0; i < 11; i++) { 44a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com SkDebugf("--- %d [%g %g]\n", i, dst[i].fX, dst[i].fY); 45a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com } 46a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com#endif 47a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com} 48a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com 49d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.comstatic void test_cubic2() { 50d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com const char* str = "M2242 -590088L-377758 9.94099e+07L-377758 9.94099e+07L2242 -590088Z"; 51d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkPath path; 52d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkParsePath::FromSVGString(str, &path); 53ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 54d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com { 55f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#ifdef SK_BUILD_FOR_WIN 56f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com // windows doesn't have strtof 57f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com float x = (float)strtod("9.94099e+07", NULL); 58f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#else 59d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com float x = strtof("9.94099e+07", NULL); 60f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#endif 61d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com int ix = (int)x; 62d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com int fx = (int)(x * 65536); 63d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com int ffx = SkScalarToFixed(x); 64fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com SkDebugf("%g %x %x %x\n", x, ix, fx, ffx); 65ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 66d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkRect r = path.getBounds(); 67d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkIRect ir; 68d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com r.round(&ir); 69fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com SkDebugf("[%g %g %g %g] [%x %x %x %x]\n", 70fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com SkScalarToDouble(r.fLeft), SkScalarToDouble(r.fTop), 71fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com SkScalarToDouble(r.fRight), SkScalarToDouble(r.fBottom), 72fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com ir.fLeft, ir.fTop, ir.fRight, ir.fBottom); 73d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com } 74ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 75d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkBitmap bitmap; 76a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bitmap.allocN32Pixels(300, 200); 77d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com 78d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkCanvas canvas(bitmap); 79d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com SkPaint paint; 80d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com paint.setAntiAlias(true); 81d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com canvas.drawPath(path, paint); 82d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com} 83d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com 840faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comclass PathView : public SampleView { 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int fDStroke, fStroke, fMinStroke, fMaxStroke; 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPath fPath[6]; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool fShowHairline; 89c9fa63c869d9216869da64c1defb150655ade3afreed@google.com bool fOnce; 90ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com PathView() { 92c9fa63c869d9216869da64c1defb150655ade3afreed@google.com fOnce = false; 93c9fa63c869d9216869da64c1defb150655ade3afreed@google.com } 94ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 95c9fa63c869d9216869da64c1defb150655ade3afreed@google.com void init() { 96c9fa63c869d9216869da64c1defb150655ade3afreed@google.com if (fOnce) { 97c9fa63c869d9216869da64c1defb150655ade3afreed@google.com return; 98c9fa63c869d9216869da64c1defb150655ade3afreed@google.com } 99c9fa63c869d9216869da64c1defb150655ade3afreed@google.com fOnce = true; 100c9fa63c869d9216869da64c1defb150655ade3afreed@google.com 101a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com test_cubic(); 102d0d0e65a6313f01dfd952e8cc214a7c193bec57areed@android.com test_cubic2(); 103a964028843ec3f69b3b2e556426ff881d1fcb4b2reed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fShowHairline = false; 105ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDStroke = 1; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fStroke = 10; 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMinStroke = 10; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fMaxStroke = 180; 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const int V = 85; 112ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[0].moveTo(SkIntToScalar(40), SkIntToScalar(70)); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[0].lineTo(SkIntToScalar(70), SkIntToScalar(70) + SK_Scalar1/1); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[0].lineTo(SkIntToScalar(110), SkIntToScalar(70)); 116ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[1].moveTo(SkIntToScalar(40), SkIntToScalar(70)); 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[1].lineTo(SkIntToScalar(70), SkIntToScalar(70) - SK_Scalar1/1); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[1].lineTo(SkIntToScalar(110), SkIntToScalar(70)); 120ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[2].moveTo(SkIntToScalar(V), SkIntToScalar(V)); 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(V)); 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(50)); 124ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[3].moveTo(SkIntToScalar(50), SkIntToScalar(50)); 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[3].lineTo(SkIntToScalar(50), SkIntToScalar(V)); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[3].lineTo(SkIntToScalar(V), SkIntToScalar(V)); 128ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[4].moveTo(SkIntToScalar(50), SkIntToScalar(50)); 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[4].lineTo(SkIntToScalar(50), SkIntToScalar(V)); 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[4].lineTo(SkIntToScalar(52), SkIntToScalar(50)); 132ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[5].moveTo(SkIntToScalar(52), SkIntToScalar(50)); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(V)); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(50)); 136ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1370faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->setBGColor(0xFFDDDDDD); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 139ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1400faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com void nextStroke() { 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fStroke += fDStroke; 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fStroke > fMaxStroke || fStroke < fMinStroke) 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fDStroke = -fDStroke; 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 145ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 1480faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com virtual bool onQuery(SkEvent* evt) { 1490faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com if (SampleCode::TitleQ(*evt)) { 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Paths"); 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 155ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1560faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j) { 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 158ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStyle(SkPaint::kStroke_Style); 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStrokeJoin(j); 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStrokeWidth(SkIntToScalar(fStroke)); 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1640faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com if (fShowHairline) { 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPath fill; 166ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 167ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com paint.getFillPath(path, &fill); 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStrokeWidth(0); 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawPath(fill, paint); 1700faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com } else { 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawPath(path, paint); 1720faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com } 173ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorRED); 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStrokeWidth(0); 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawPath(path, paint); 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 178ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 179c9fa63c869d9216869da64c1defb150655ade3afreed@google.com virtual void onDrawContent(SkCanvas* canvas) { 180c9fa63c869d9216869da64c1defb150655ade3afreed@google.com this->init(); 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(50), SkIntToScalar(50)); 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static const SkPaint::Join gJoins[] = { 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint::kBevel_Join, 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint::kMiter_Join, 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint::kRound_Join 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18964cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gJoins); i++) { 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 19164cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org for (size_t j = 0; j < SK_ARRAY_COUNT(fPath); j++) { 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->drawPath(canvas, fPath[j], gJoins[i]); 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(200), 0); 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 196ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(0, SkIntToScalar(200)); 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 199ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->nextStroke(); 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 203ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 2044d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fShowHairline = !fShowHairline; 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 2074d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com return this->INHERITED::onFindClickHandler(x, y, modi); 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 209ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2110faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com typedef SampleView INHERITED; 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new PathView; } 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 218