1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Mozilla Foundation
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "fuzz/Fuzz.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextBlob.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPaintPriv.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker static const int kBmpSize = 24;
21*c8dee2aaSAndroid Build Coastguard Worker static const int kMaxX = 250;
22*c8dee2aaSAndroid Build Coastguard Worker static const int kMaxY = 250;
23*c8dee2aaSAndroid Build Coastguard Worker static const int kPtsLen = 10;
24*c8dee2aaSAndroid Build Coastguard Worker static const int kTxtLen = 5;
25*c8dee2aaSAndroid Build Coastguard Worker
init_string(Fuzz * fuzz,char * str,size_t bufSize)26*c8dee2aaSAndroid Build Coastguard Worker static void init_string(Fuzz* fuzz, char* str, size_t bufSize) {
27*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < bufSize-1; ++i) {
28*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&str[i], 0x20, 0x7E); // printable ASCII
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker str[bufSize-1] = '\0';
31*c8dee2aaSAndroid Build Coastguard Worker }
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker // make_paint mostly borrowed from FilterFuzz.cpp
init_paint(Fuzz * fuzz,SkPaint * p)34*c8dee2aaSAndroid Build Coastguard Worker static void init_paint(Fuzz* fuzz, SkPaint* p) {
35*c8dee2aaSAndroid Build Coastguard Worker bool b;
36*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
37*c8dee2aaSAndroid Build Coastguard Worker p->setAntiAlias(b);
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker uint8_t tmp_u8;
40*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&tmp_u8, 0, (int)SkBlendMode::kLastMode);
41*c8dee2aaSAndroid Build Coastguard Worker p->setBlendMode(static_cast<SkBlendMode>(tmp_u8));
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker SkColor co;
44*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&co);
45*c8dee2aaSAndroid Build Coastguard Worker p->setColor(co);
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
48*c8dee2aaSAndroid Build Coastguard Worker p->setDither(b);
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&tmp_u8, 0, (int)SkPaint::kLast_Cap);
51*c8dee2aaSAndroid Build Coastguard Worker p->setStrokeCap(static_cast<SkPaint::Cap>(tmp_u8));
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&tmp_u8, 0, (int)SkPaint::kLast_Join);
54*c8dee2aaSAndroid Build Coastguard Worker p->setStrokeJoin(static_cast<SkPaint::Join>(tmp_u8));
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker SkScalar sc;
57*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&sc);
58*c8dee2aaSAndroid Build Coastguard Worker p->setStrokeMiter(sc);
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&sc);
61*c8dee2aaSAndroid Build Coastguard Worker p->setStrokeWidth(sc);
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&tmp_u8, 0, (int)SkPaint::kStrokeAndFill_Style);
64*c8dee2aaSAndroid Build Coastguard Worker p->setStyle(static_cast<SkPaint::Style>(tmp_u8));
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker
init_bitmap(Fuzz * fuzz,SkBitmap * bmp)67*c8dee2aaSAndroid Build Coastguard Worker static void init_bitmap(Fuzz* fuzz, SkBitmap* bmp) {
68*c8dee2aaSAndroid Build Coastguard Worker uint8_t colorType;
69*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&colorType, 0, (int)kLastEnum_SkColorType);
70*c8dee2aaSAndroid Build Coastguard Worker // ColorType needs to match what the system configuration is.
71*c8dee2aaSAndroid Build Coastguard Worker if (colorType == kRGBA_8888_SkColorType || colorType == kBGRA_8888_SkColorType) {
72*c8dee2aaSAndroid Build Coastguard Worker colorType = kN32_SkColorType;
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker bool b;
75*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
76*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = SkImageInfo::Make(kBmpSize,
77*c8dee2aaSAndroid Build Coastguard Worker kBmpSize,
78*c8dee2aaSAndroid Build Coastguard Worker (SkColorType)colorType,
79*c8dee2aaSAndroid Build Coastguard Worker b ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
80*c8dee2aaSAndroid Build Coastguard Worker if (!bmp->tryAllocPixels(info)) {
81*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Bitmap not allocated\n");
82*c8dee2aaSAndroid Build Coastguard Worker }
83*c8dee2aaSAndroid Build Coastguard Worker SkColor c;
84*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&c);
85*c8dee2aaSAndroid Build Coastguard Worker bmp->eraseColor(c);
86*c8dee2aaSAndroid Build Coastguard Worker
87*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
88*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
89*c8dee2aaSAndroid Build Coastguard Worker if (b) {
90*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
91*c8dee2aaSAndroid Build Coastguard Worker }
92*c8dee2aaSAndroid Build Coastguard Worker else {
93*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&c);
94*c8dee2aaSAndroid Build Coastguard Worker p.setColor(c);
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker }
97*c8dee2aaSAndroid Build Coastguard Worker
init_surface(Fuzz * fuzz,sk_sp<SkSurface> * s)98*c8dee2aaSAndroid Build Coastguard Worker static void init_surface(Fuzz* fuzz, sk_sp<SkSurface>* s) {
99*c8dee2aaSAndroid Build Coastguard Worker uint8_t x, y;
100*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&x, 1, kMaxX);
101*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&y, 1, kMaxY);
102*c8dee2aaSAndroid Build Coastguard Worker *s = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(x, y));
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker if (!*s) {
105*c8dee2aaSAndroid Build Coastguard Worker // Was possibly too big for the memory constrained fuzzing environments
106*c8dee2aaSAndroid Build Coastguard Worker *s = SkSurfaces::Null(x, y);
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawText(Fuzz * fuzz,sk_sp<SkTypeface> typeface)111*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawText(Fuzz* fuzz, sk_sp<SkTypeface> typeface) {
112*c8dee2aaSAndroid Build Coastguard Worker SkFont font(std::move(typeface));
113*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
114*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
115*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
116*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Worker char text[kTxtLen];
119*c8dee2aaSAndroid Build Coastguard Worker init_string(fuzz, text, kTxtLen);
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker SkScalar x, y;
122*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&x, &y);
123*c8dee2aaSAndroid Build Coastguard Worker // populate pts array
124*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts[kPtsLen];
125*c8dee2aaSAndroid Build Coastguard Worker for (uint8_t i = 0; i < kPtsLen; ++i) {
126*c8dee2aaSAndroid Build Coastguard Worker pts[i].set(x, y);
127*c8dee2aaSAndroid Build Coastguard Worker x += font.getSize();
128*c8dee2aaSAndroid Build Coastguard Worker }
129*c8dee2aaSAndroid Build Coastguard Worker
130*c8dee2aaSAndroid Build Coastguard Worker bool b;
131*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
132*c8dee2aaSAndroid Build Coastguard Worker font.setForceAutoHinting(b);
133*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
134*c8dee2aaSAndroid Build Coastguard Worker font.setEmbeddedBitmaps(b);
135*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
136*c8dee2aaSAndroid Build Coastguard Worker font.setEmbolden(b);
137*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
138*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(b ? SkFont::Edging::kAntiAlias : SkFont::Edging::kSubpixelAntiAlias);
139*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
140*c8dee2aaSAndroid Build Coastguard Worker font.setLinearMetrics(b);
141*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&b);
142*c8dee2aaSAndroid Build Coastguard Worker font.setSubpixel(b);
143*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&x);
144*c8dee2aaSAndroid Build Coastguard Worker font.setScaleX(x);
145*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&x);
146*c8dee2aaSAndroid Build Coastguard Worker font.setSkewX(x);
147*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&x);
148*c8dee2aaSAndroid Build Coastguard Worker font.setSize(x);
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* cnv = surface->getCanvas();
151*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&x);
152*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&y);
153*c8dee2aaSAndroid Build Coastguard Worker cnv->drawTextBlob(SkTextBlob::MakeFromPosText(text, kTxtLen-1, pts, font), x, y, p);
154*c8dee2aaSAndroid Build Coastguard Worker }
155*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawCircle(Fuzz * fuzz)156*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawCircle(Fuzz* fuzz) {
157*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
158*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
159*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
160*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
161*c8dee2aaSAndroid Build Coastguard Worker
162*c8dee2aaSAndroid Build Coastguard Worker SkScalar a, b, c;
163*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c);
164*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawCircle(a, b, c, p);
165*c8dee2aaSAndroid Build Coastguard Worker }
166*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawLine(Fuzz * fuzz)167*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawLine(Fuzz* fuzz) {
168*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
169*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
170*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
171*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
172*c8dee2aaSAndroid Build Coastguard Worker
173*c8dee2aaSAndroid Build Coastguard Worker SkScalar a, b, c, d;
174*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d);
175*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawLine(a, b, c, d, p);
176*c8dee2aaSAndroid Build Coastguard Worker }
177*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawRect(Fuzz * fuzz)178*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawRect(Fuzz* fuzz) {
179*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
180*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
181*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
182*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
183*c8dee2aaSAndroid Build Coastguard Worker
184*c8dee2aaSAndroid Build Coastguard Worker SkScalar a, b, c, d;
185*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d);
186*c8dee2aaSAndroid Build Coastguard Worker SkRect r;
187*c8dee2aaSAndroid Build Coastguard Worker r = SkRect::MakeXYWH(a, b, c, d);
188*c8dee2aaSAndroid Build Coastguard Worker
189*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* cnv = surface->getCanvas();
190*c8dee2aaSAndroid Build Coastguard Worker cnv->drawRect(r, p);
191*c8dee2aaSAndroid Build Coastguard Worker
192*c8dee2aaSAndroid Build Coastguard Worker bool bl;
193*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&bl);
194*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d);
195*c8dee2aaSAndroid Build Coastguard Worker r = SkRect::MakeXYWH(a, b, c, d);
196*c8dee2aaSAndroid Build Coastguard Worker cnv->clipRect(r, SkClipOp::kIntersect, bl);
197*c8dee2aaSAndroid Build Coastguard Worker }
198*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawPath(Fuzz * fuzz)199*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawPath(Fuzz* fuzz) {
200*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
201*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
202*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
203*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker // TODO(kjlubick): put the ability to fuzz a path in shared file, with
206*c8dee2aaSAndroid Build Coastguard Worker // other common things (e.g. rects, lines)
207*c8dee2aaSAndroid Build Coastguard Worker uint8_t i, j;
208*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&i, 0, 10); // set i to number of operations to perform
209*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
210*c8dee2aaSAndroid Build Coastguard Worker SkScalar a, b, c, d, e, f;
211*c8dee2aaSAndroid Build Coastguard Worker for (int k = 0; k < i; ++k) {
212*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&j, 0, 5); // set j to choose operation to perform
213*c8dee2aaSAndroid Build Coastguard Worker switch (j) {
214*c8dee2aaSAndroid Build Coastguard Worker case 0:
215*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b);
216*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(a, b);
217*c8dee2aaSAndroid Build Coastguard Worker break;
218*c8dee2aaSAndroid Build Coastguard Worker case 1:
219*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b);
220*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(a, b);
221*c8dee2aaSAndroid Build Coastguard Worker break;
222*c8dee2aaSAndroid Build Coastguard Worker case 2:
223*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d);
224*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(a, b, c, d);
225*c8dee2aaSAndroid Build Coastguard Worker break;
226*c8dee2aaSAndroid Build Coastguard Worker case 3:
227*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d, &e);
228*c8dee2aaSAndroid Build Coastguard Worker path.conicTo(a, b, c, d, e);
229*c8dee2aaSAndroid Build Coastguard Worker break;
230*c8dee2aaSAndroid Build Coastguard Worker case 4:
231*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d, &e, &f);
232*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(a, b, c, d, e, f);
233*c8dee2aaSAndroid Build Coastguard Worker break;
234*c8dee2aaSAndroid Build Coastguard Worker case 5:
235*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b, &c, &d, &e);
236*c8dee2aaSAndroid Build Coastguard Worker path.arcTo(a, b, c, d, e);
237*c8dee2aaSAndroid Build Coastguard Worker break;
238*c8dee2aaSAndroid Build Coastguard Worker }
239*c8dee2aaSAndroid Build Coastguard Worker }
240*c8dee2aaSAndroid Build Coastguard Worker path.close();
241*c8dee2aaSAndroid Build Coastguard Worker
242*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* cnv = surface->getCanvas();
243*c8dee2aaSAndroid Build Coastguard Worker cnv->drawPath(path, p);
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard Worker bool bl;
246*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&bl);
247*c8dee2aaSAndroid Build Coastguard Worker cnv->clipPath(path, SkClipOp::kIntersect, bl);
248*c8dee2aaSAndroid Build Coastguard Worker }
249*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawImage(Fuzz * fuzz)250*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawImage(Fuzz* fuzz) {
251*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
252*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
253*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
254*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
255*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bmp;
256*c8dee2aaSAndroid Build Coastguard Worker init_bitmap(fuzz, &bmp);
257*c8dee2aaSAndroid Build Coastguard Worker
258*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> image(bmp.asImage());
259*c8dee2aaSAndroid Build Coastguard Worker
260*c8dee2aaSAndroid Build Coastguard Worker bool bl;
261*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&bl);
262*c8dee2aaSAndroid Build Coastguard Worker SkScalar a, b;
263*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b);
264*c8dee2aaSAndroid Build Coastguard Worker if (bl) {
265*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawImage(image, a, b, SkSamplingOptions(), &p);
266*c8dee2aaSAndroid Build Coastguard Worker }
267*c8dee2aaSAndroid Build Coastguard Worker else {
268*c8dee2aaSAndroid Build Coastguard Worker SkRect dst = SkRect::MakeWH(a, b);
269*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&a, &b);
270*c8dee2aaSAndroid Build Coastguard Worker SkRect src = SkRect::MakeWH(a, b);
271*c8dee2aaSAndroid Build Coastguard Worker uint8_t x;
272*c8dee2aaSAndroid Build Coastguard Worker fuzz->nextRange(&x, 0, 1);
273*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint cst = (SkCanvas::SrcRectConstraint)x;
274*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawImageRect(image.get(), src, dst, SkSamplingOptions(), &p, cst);
275*c8dee2aaSAndroid Build Coastguard Worker }
276*c8dee2aaSAndroid Build Coastguard Worker }
277*c8dee2aaSAndroid Build Coastguard Worker
fuzz_drawPaint(Fuzz * fuzz)278*c8dee2aaSAndroid Build Coastguard Worker static void fuzz_drawPaint(Fuzz* fuzz) {
279*c8dee2aaSAndroid Build Coastguard Worker SkPaint l, p;
280*c8dee2aaSAndroid Build Coastguard Worker init_paint(fuzz, &p);
281*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface;
282*c8dee2aaSAndroid Build Coastguard Worker init_surface(fuzz, &surface);
283*c8dee2aaSAndroid Build Coastguard Worker
284*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawPaint(p);
285*c8dee2aaSAndroid Build Coastguard Worker }
286*c8dee2aaSAndroid Build Coastguard Worker
DEF_FUZZ(DrawFunctions,fuzz)287*c8dee2aaSAndroid Build Coastguard Worker DEF_FUZZ(DrawFunctions, fuzz) {
288*c8dee2aaSAndroid Build Coastguard Worker uint8_t i;
289*c8dee2aaSAndroid Build Coastguard Worker fuzz->next(&i);
290*c8dee2aaSAndroid Build Coastguard Worker
291*c8dee2aaSAndroid Build Coastguard Worker switch(i) {
292*c8dee2aaSAndroid Build Coastguard Worker case 0: {
293*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkTypeface> f = ToolUtils::DefaultPortableTypeface();
294*c8dee2aaSAndroid Build Coastguard Worker if (f == nullptr) {
295*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Could not initialize font.\n");
296*c8dee2aaSAndroid Build Coastguard Worker fuzz->signalBug();
297*c8dee2aaSAndroid Build Coastguard Worker }
298*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawText\n");
299*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawText(fuzz, f);
300*c8dee2aaSAndroid Build Coastguard Worker return;
301*c8dee2aaSAndroid Build Coastguard Worker }
302*c8dee2aaSAndroid Build Coastguard Worker case 1:
303*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawRect\n");
304*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawRect(fuzz);
305*c8dee2aaSAndroid Build Coastguard Worker return;
306*c8dee2aaSAndroid Build Coastguard Worker case 2:
307*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawCircle\n");
308*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawCircle(fuzz);
309*c8dee2aaSAndroid Build Coastguard Worker return;
310*c8dee2aaSAndroid Build Coastguard Worker case 3:
311*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawLine\n");
312*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawLine(fuzz);
313*c8dee2aaSAndroid Build Coastguard Worker return;
314*c8dee2aaSAndroid Build Coastguard Worker case 4:
315*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawPath\n");
316*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawPath(fuzz);
317*c8dee2aaSAndroid Build Coastguard Worker return;
318*c8dee2aaSAndroid Build Coastguard Worker case 5:
319*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawImage/DrawImageRect\n");
320*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawImage(fuzz);
321*c8dee2aaSAndroid Build Coastguard Worker return;
322*c8dee2aaSAndroid Build Coastguard Worker case 6:
323*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGF("Fuzz DrawPaint\n");
324*c8dee2aaSAndroid Build Coastguard Worker fuzz_drawPaint(fuzz);
325*c8dee2aaSAndroid Build Coastguard Worker return;
326*c8dee2aaSAndroid Build Coastguard Worker }
327*c8dee2aaSAndroid Build Coastguard Worker }
328