180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gm.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef SkScalar (*MakePathProc)(SkPath*); 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_frame(SkPath* path) { 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(630), SkIntToScalar(470) }; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15)); 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStyle(SkPaint::kStroke_Style); 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStrokeWidth(SkIntToScalar(5)); 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.getFillPath(*path, path); 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(15); 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_triangle(SkPath* path) { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const int gCoord[] = { 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10, 20, 15, 5, 30, 30 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->offset(SkIntToScalar(10), SkIntToScalar(0)); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(30); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_rect(SkPath* path) { 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(30), SkIntToScalar(30) }; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->addRect(r); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->offset(SkIntToScalar(10), SkIntToScalar(0)); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(30); 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_oval(SkPath* path) { 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(30), SkIntToScalar(30) }; 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->addOval(r); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->offset(SkIntToScalar(10), SkIntToScalar(0)); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(30); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_sawtooth(SkPath* path) { 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar x = SkIntToScalar(20); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar y = SkIntToScalar(20); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar x0 = x; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar dx = SK_Scalar1 * 5; 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar dy = SK_Scalar1 * 10; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(x, y); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < 32; i++) { 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x += dx; 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(x, y - dy); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x += dx; 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(x, y + dy); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(x, y + (2 * dy)); 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(x0, y + (2 * dy)); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(30); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star(SkPath* path, int n) { 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar c = SkIntToScalar(45); 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar r = SkIntToScalar(20); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar rad = -SK_ScalarPI / 2; 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(c, c - r); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 1; i < n; i++) { 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rad += drad; 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r)); 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return r * 2 * 6 / 5; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// We don't expect any output from this path. 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_line(SkPath* path) { 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(SkIntToScalar(30), SkIntToScalar(30)); 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(120), SkIntToScalar(40)); 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(SkIntToScalar(150), SkIntToScalar(30)); 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(150), SkIntToScalar(30)); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(300), SkIntToScalar(40)); 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkIntToScalar(40); 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const MakePathProc gProcs[] = { 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_frame, 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_triangle, 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_rect, 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_oval, 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_sawtooth, 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_star_5, 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_star_13, 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_line, 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define N SK_ARRAY_COUNT(gProcs) 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PathFillGM : public skiagm::GM { 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath fPath[N]; 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fDY[N]; 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PathFillGM() { 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (size_t i = 0; i < N; i++) { 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDY[i] = gProcs[i](&fPath[i]); 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkString onShortName() { 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkString("pathfill"); 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkISize onISize() { 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkISize::Make(640, 480); 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setAntiAlias(true); 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (size_t i = 0; i < N; i++) { 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPath(fPath[i], paint); 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(0), fDY[i]); 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef skiagm::GM INHERITED; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// test inverse-fill w/ a clip that completely excludes the geometry 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PathInverseFillGM : public skiagm::GM { 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath fPath[N]; 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fDY[N]; 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PathInverseFillGM() { 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (size_t i = 0; i < N; i++) { 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDY[i] = gProcs[i](&fPath[i]); 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkString onShortName() { 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkString("pathinvfill"); 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkISize onISize() { 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkISize::Make(450, 220); 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void show(SkCanvas* canvas, const SkPath& path, const SkPaint& paint, 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkRect* clip, SkScalar top, const SkScalar bottom) { 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (clip) { 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = *clip; 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.fTop = top; 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.fBottom = bottom; 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRect(r); 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPath(path, paint); 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath path; 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.addCircle(SkIntToScalar(50), SkIntToScalar(50), SkIntToScalar(40)); 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.toggleInverseFillType(); 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect clipR = { 0, 0, SkIntToScalar(100), SkIntToScalar(200) }; 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int doclip = 0; doclip <= 1; ++doclip) { 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int aa = 0; aa <= 1; ++aa) { 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setAntiAlias(SkToBool(aa)); 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRect(clipR); 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkRect* clipPtr = doclip ? &clipR : NULL; 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru show(canvas, path, paint, clipPtr, clipR.fTop, clipR.centerY()); 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru show(canvas, path, paint, clipPtr, clipR.centerY(), clipR.fBottom); 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(110), 0); 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef skiagm::GM INHERITED; 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* MyFactory(void*) { return new PathFillGM; } 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry reg(MyFactory); 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* F1(void*) { return new PathInverseFillGM; } 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry gR1(F1); 223