/* * 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 surface; static std::unique_ptr Create(Options options) { SkImageInfo info = SkImageInfo::MakeN32Premul(0,0); 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 image() override { return surface->makeImageSnapshot(); } }; static Register sw{"sw", "draw with the software backend", SWDst::Create}; 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); }};