/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "ok.h"
#include "SkSurface.h"

struct SWDst : Dst {
    SkImageInfo      info;
    sk_sp<SkSurface> surface;

    static std::unique_ptr<Dst> Create(Options options) {
        SkImageInfo info = SkImageInfo::MakeN32Premul(0,0);
        if (options("ct") == "a8")  { info = info.makeColorType(kAlpha_8_SkColorType); }
        if (options("ct") == "565") { info = info.makeColorType(kRGB_565_SkColorType); }
        if (options("ct") == "f16") { info = info.makeColorType(kRGBA_F16_SkColorType); }

        if (options("cs") == "srgb") {
            auto cs = info.colorType() == kRGBA_F16_SkColorType ? SkColorSpace::MakeSRGBLinear()
                                                                : SkColorSpace::MakeSRGB();
            info = info.makeColorSpace(std::move(cs));
        }

        SWDst dst;
        dst.info = info;
        return move_unique(dst);
    }

    Status draw(Src* src) override {
        auto size = src->size();
        surface = SkSurface::MakeRaster(info.makeWH(size.width(), size.height()));
        return src->draw(surface->getCanvas());
    }

    sk_sp<SkImage> image() override {
        return surface->makeImageSnapshot();
    }
};
static Register sw{"sw", "draw with the software backend", SWDst::Create};
static Register _8888{"8888", "alias for sw", SWDst::Create};

static Register a8{"a8", "alias for sw:ct=a8", [](Options options) {
    options["ct"] = "a8";
    return SWDst::Create(options);
}};

static Register _565{"565", "alias for sw:ct=565", [](Options options) {
    options["ct"] = "565";
    return SWDst::Create(options);
}};

static Register srgb{"srgb", "alias for sw:cs=srgb", [](Options options) {
    options["cs"] = "srgb";
    return SWDst::Create(options);
}};

static Register f16{"f16", "alias for sw:ct=f16,cs=srgb", [](Options options) {
    options["ct"] = "f16";
    options["cs"] = "srgb";
    return SWDst::Create(options);
}};

extern bool gSkForceRasterPipelineBlitter;
static Register rp{"rp", "draw forcing SkRasterPipelineBlitter", [](Options options) {
    gSkForceRasterPipelineBlitter = true;
    return SWDst::Create(options);
}};
