1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors. All rights reserved.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*c8dee2aaSAndroid Build Coastguard Worker // found in the LICENSE file.
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
6*c8dee2aaSAndroid Build Coastguard Worker #include "SkFlattenableSerialization.h"
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageFilter.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkOSFile.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker #include <stdio.h>
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker static const int kBitmapSize = 24;
14*c8dee2aaSAndroid Build Coastguard Worker
read_test_case(const char * filename,SkString * testdata)15*c8dee2aaSAndroid Build Coastguard Worker static bool read_test_case(const char* filename, SkString* testdata) {
16*c8dee2aaSAndroid Build Coastguard Worker FILE* file = sk_fopen(filename, kRead_SkFILE_Flag);
17*c8dee2aaSAndroid Build Coastguard Worker if (!file) {
18*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("couldn't open file %s\n", filename);
19*c8dee2aaSAndroid Build Coastguard Worker return false;
20*c8dee2aaSAndroid Build Coastguard Worker }
21*c8dee2aaSAndroid Build Coastguard Worker size_t len = sk_fgetsize(file);
22*c8dee2aaSAndroid Build Coastguard Worker if (!len) {
23*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("couldn't read file %s\n", filename);
24*c8dee2aaSAndroid Build Coastguard Worker return false;
25*c8dee2aaSAndroid Build Coastguard Worker }
26*c8dee2aaSAndroid Build Coastguard Worker testdata->resize(len);
27*c8dee2aaSAndroid Build Coastguard Worker (void) fread(testdata->data(), len, file);
28*c8dee2aaSAndroid Build Coastguard Worker return true;
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker
run_test_case(const SkString & testdata,const SkBitmap & bitmap,SkCanvas * canvas)31*c8dee2aaSAndroid Build Coastguard Worker static void run_test_case(const SkString& testdata, const SkBitmap& bitmap,
32*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas) {
33*c8dee2aaSAndroid Build Coastguard Worker // This call shouldn't crash or cause ASAN to flag any memory issues
34*c8dee2aaSAndroid Build Coastguard Worker // If nothing bad happens within this call, everything is fine
35*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImageFilter> flattenable = SkValidatingDeserializeImageFilter(testdata.c_str(),
36*c8dee2aaSAndroid Build Coastguard Worker testdata.size());
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker // Adding some info, but the test passed if we got here without any trouble
39*c8dee2aaSAndroid Build Coastguard Worker if (flattenable != nullptr) {
40*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Valid stream detected.\n");
41*c8dee2aaSAndroid Build Coastguard Worker // Let's see if using the filters can cause any trouble...
42*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
43*c8dee2aaSAndroid Build Coastguard Worker paint.setImageFilter(flattenable);
44*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
45*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(SkRect::MakeXYWH(
46*c8dee2aaSAndroid Build Coastguard Worker 0, 0, SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)));
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker // This call shouldn't crash or cause ASAN to flag any memory issues
49*c8dee2aaSAndroid Build Coastguard Worker // If nothing bad happens within this call, everything is fine
50*c8dee2aaSAndroid Build Coastguard Worker canvas->drawBitmap(bitmap, 0, 0, &paint);
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Filter DAG rendered successfully.\n");
53*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
54*c8dee2aaSAndroid Build Coastguard Worker } else {
55*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Invalid stream detected.\n");
56*c8dee2aaSAndroid Build Coastguard Worker }
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker
read_and_run_test_case(const char * filename,const SkBitmap & bitmap,SkCanvas * canvas)59*c8dee2aaSAndroid Build Coastguard Worker static bool read_and_run_test_case(const char* filename, const SkBitmap& bitmap,
60*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas) {
61*c8dee2aaSAndroid Build Coastguard Worker SkString testdata;
62*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Test case: %s\n", filename);
63*c8dee2aaSAndroid Build Coastguard Worker // read_test_case will print a useful error message if it fails.
64*c8dee2aaSAndroid Build Coastguard Worker if (!read_test_case(filename, &testdata))
65*c8dee2aaSAndroid Build Coastguard Worker return false;
66*c8dee2aaSAndroid Build Coastguard Worker run_test_case(testdata, bitmap, canvas);
67*c8dee2aaSAndroid Build Coastguard Worker return true;
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
main(int argc,char ** argv)70*c8dee2aaSAndroid Build Coastguard Worker int main(int argc, char** argv) {
71*c8dee2aaSAndroid Build Coastguard Worker int ret = 0;
72*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap;
73*c8dee2aaSAndroid Build Coastguard Worker bitmap.allocN32Pixels(kBitmapSize, kBitmapSize);
74*c8dee2aaSAndroid Build Coastguard Worker SkCanvas canvas(bitmap);
75*c8dee2aaSAndroid Build Coastguard Worker canvas.clear(0x00000000);
76*c8dee2aaSAndroid Build Coastguard Worker for (int i = 1; i < argc; i++)
77*c8dee2aaSAndroid Build Coastguard Worker if (!read_and_run_test_case(argv[i], bitmap, &canvas))
78*c8dee2aaSAndroid Build Coastguard Worker ret = 2;
79*c8dee2aaSAndroid Build Coastguard Worker // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish
80*c8dee2aaSAndroid Build Coastguard Worker // successful runs from crashes.
81*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("#EOF\n");
82*c8dee2aaSAndroid Build Coastguard Worker return ret;
83*c8dee2aaSAndroid Build Coastguard Worker }
84