| // Copyright 2013 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "SkCanvas.h" | 
 | #include "SkFlattenableSerialization.h" | 
 | #include "SkImageFilter.h" | 
 | #include "SkOSFile.h" | 
 | #include "SkString.h" | 
 |  | 
 | static const int kBitmapSize = 24; | 
 |  | 
 | static bool read_test_case(const char* filename, SkString* testdata) { | 
 |   FILE* file = sk_fopen(filename, kRead_SkFILE_Flag); | 
 |   if (!file) { | 
 |     SkDebugf("couldn't open file %s\n", filename); | 
 |     return false; | 
 |   } | 
 |   size_t len = sk_fgetsize(file); | 
 |   if (!len) { | 
 |     SkDebugf("couldn't read file %s\n", filename); | 
 |     return false; | 
 |   } | 
 |   testdata->resize(len); | 
 |   (void) sk_fread(testdata->writable_str(), len, file); | 
 |   return true; | 
 | } | 
 |  | 
 | static void run_test_case(const SkString& testdata, const SkBitmap& bitmap, | 
 |                  SkCanvas* canvas) { | 
 |   // This call shouldn't crash or cause ASAN to flag any memory issues | 
 |   // If nothing bad happens within this call, everything is fine | 
 |   SkFlattenable* flattenable = SkValidatingDeserializeFlattenable( | 
 |         testdata.c_str(), testdata.size(), SkImageFilter::GetFlattenableType()); | 
 |  | 
 |   // Adding some info, but the test passed if we got here without any trouble | 
 |   if (flattenable != nullptr) { | 
 |     SkDebugf("Valid stream detected.\n"); | 
 |     // Let's see if using the filters can cause any trouble... | 
 |     SkPaint paint; | 
 |     paint.setImageFilter(static_cast<SkImageFilter*>(flattenable))->unref(); | 
 |     canvas->save(); | 
 |     canvas->clipRect(SkRect::MakeXYWH( | 
 |         0, 0, SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize))); | 
 |  | 
 |     // This call shouldn't crash or cause ASAN to flag any memory issues | 
 |     // If nothing bad happens within this call, everything is fine | 
 |     canvas->drawBitmap(bitmap, 0, 0, &paint); | 
 |  | 
 |     SkDebugf("Filter DAG rendered successfully.\n"); | 
 |     canvas->restore(); | 
 |   } else { | 
 |     SkDebugf("Invalid stream detected.\n"); | 
 |   } | 
 | } | 
 |  | 
 | static bool read_and_run_test_case(const char* filename, const SkBitmap& bitmap, | 
 |                         SkCanvas* canvas) { | 
 |   SkString testdata; | 
 |   SkDebugf("Test case: %s\n", filename); | 
 |   // read_test_case will print a useful error message if it fails. | 
 |   if (!read_test_case(filename, &testdata)) | 
 |     return false; | 
 |   run_test_case(testdata, bitmap, canvas); | 
 |   return true; | 
 | } | 
 |  | 
 | int main(int argc, char** argv) { | 
 |   int ret = 0; | 
 |   SkBitmap bitmap; | 
 |   bitmap.allocN32Pixels(kBitmapSize, kBitmapSize); | 
 |   SkCanvas canvas(bitmap); | 
 |   canvas.clear(0x00000000); | 
 |   for (int i = 1; i < argc; i++) | 
 |     if (!read_and_run_test_case(argv[i], bitmap, &canvas)) | 
 |       ret = 2; | 
 |   // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish | 
 |   // successful runs from crashes. | 
 |   SkDebugf("#EOF\n"); | 
 |   return ret; | 
 | } |