// Copyright 2020 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "tools/fiddle/examples.h"
REG_FIDDLE(example3ps, 320, 256, false, 0) {
static SkMatrix setpsmatrix(float sx, float kx, float ky, float sy, float tx, float ty, int h) {
    SkMatrix m;

    m.setAll(sx, -kx, -tx * sx - (ty - h) * kx, -ky, sy, (ty - h) * sy + tx * ky, 0, 0, 1);
    return m;
}

void draw(SkCanvas* canvas) {
    canvas->save();
    canvas->scale(15, -15);
    canvas->translate(0, -28);
    SkPath path = SkPathBuilder()
                  .moveTo(2, 2)
                  .lineTo(3, 3)
                  .lineTo(3, 4)
                  .lineTo(2, 4)
                  .lineTo(1, 5)
                  .close()
                  .detach();
    SkPaint p;
    p.setAntiAlias(true);
    p.setStrokeWidth(0.1f);

    canvas->save();
    canvas->translate(0, 18);
    p.setColor(SK_ColorGRAY);
    canvas->drawPath(path, p);
    canvas->restore();

    p.setStyle(SkPaint::kStroke_Style);
    canvas->save();
    canvas->translate(8, 19);
    canvas->rotate(90);
    p.setColor(SK_ColorRED);
    canvas->drawPath(path, p);
    canvas->restore();

    canvas->save();
    canvas->translate(5, 23);
    canvas->rotate(-90);
    p.setColor(SK_ColorBLUE);
    canvas->drawPath(path, p);
    canvas->restore();

    canvas->save();
    canvas->translate(14, 18);
    canvas->scale(-1, 1);
    p.setColor(0xFF007F00);
    canvas->drawPath(path, p);
    canvas->restore();
    canvas->restore();

    canvas->scale(15, 15);
    canvas->translate(0, 24);

    SkMatrix m;
    unsigned char d[] = {0x00, 0x00, 0x00, 0x00, 0xff, 0xff};
    sk_sp<SkData> data = SkData::MakeWithoutCopy((unsigned char*)d, sizeof(d));
    SkImageInfo info =
            SkImageInfo::Make(3, 2, SkColorType::kGray_8_SkColorType, kOpaque_SkAlphaType);
    sk_sp<SkImage> image = SkImages::RasterFromData(info, data, 3);

    canvas->save();
    m = setpsmatrix(1, 0, 0, 1, -1, -24, 2);
    //  m.setAll(1, 0, -1, 0, 1, -24, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();

    canvas->save();
    m = setpsmatrix(0, 1, 1, 0, -24, -5, 2);
    //  m.setAll(0, -1, 5, -1, 0, -22, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();

    canvas->save();
    m = setpsmatrix(0, 1, -1, 0, 27, -8, 2);
    //  m.setAll(0, -1, 8, 1, 0, -25, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();

    canvas->save();
    m = setpsmatrix(0, -1, -1, 0, -24, 13, 2);
    //  m.setAll(0, 1, 9, -1, 0, -22, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();

    canvas->save();
    m = setpsmatrix(-1, 0, 0, -1, 17, 26, 2);
    //  m.setAll(-1, 0, 15, 0, -1, -22, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();

    canvas->save();
    m = setpsmatrix(-1, 0, 0, 1, 21, -24, 2);
    //  m.setAll(-1, 0, 19, 0, 1, -24, 0, 0, 1);
    canvas->concat(m);
    canvas->drawImage(image, 0, 0);
    canvas->restore();
}
}  // END FIDDLE
