// 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"

#include <stdio.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) 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
  sk_sp<SkImageFilter> flattenable = SkValidatingDeserializeImageFilter(testdata.c_str(),
                                                                        testdata.size());

  // 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(flattenable);
    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;
}
