17ac04838c58eebbac477895fafdd4b0421727b9eMike Klein/*
27ac04838c58eebbac477895fafdd4b0421727b9eMike Klein * Copyright 2017 Google Inc.
37ac04838c58eebbac477895fafdd4b0421727b9eMike Klein *
47ac04838c58eebbac477895fafdd4b0421727b9eMike Klein * Use of this source code is governed by a BSD-style license that can be
57ac04838c58eebbac477895fafdd4b0421727b9eMike Klein * found in the LICENSE file.
67ac04838c58eebbac477895fafdd4b0421727b9eMike Klein */
77ac04838c58eebbac477895fafdd4b0421727b9eMike Klein
87ac04838c58eebbac477895fafdd4b0421727b9eMike Klein#include "ok.h"
97ac04838c58eebbac477895fafdd4b0421727b9eMike Klein#include "SkSurface.h"
107ac04838c58eebbac477895fafdd4b0421727b9eMike Klein
117ac04838c58eebbac477895fafdd4b0421727b9eMike Kleinstruct SWDst : Dst {
120222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein    SkImageInfo      info;
137ac04838c58eebbac477895fafdd4b0421727b9eMike Klein    sk_sp<SkSurface> surface;
147ac04838c58eebbac477895fafdd4b0421727b9eMike Klein
150222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein    static std::unique_ptr<Dst> Create(Options options) {
160222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        SkImageInfo info = SkImageInfo::MakeN32Premul(0,0);
177ac04838c58eebbac477895fafdd4b0421727b9eMike Klein        if (options("ct") == "565") { info = info.makeColorType(kRGB_565_SkColorType); }
187ac04838c58eebbac477895fafdd4b0421727b9eMike Klein        if (options("ct") == "f16") { info = info.makeColorType(kRGBA_F16_SkColorType); }
190222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein
207ac04838c58eebbac477895fafdd4b0421727b9eMike Klein        SWDst dst;
210222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        dst.info = info;
227ac04838c58eebbac477895fafdd4b0421727b9eMike Klein        return move_unique(dst);
237ac04838c58eebbac477895fafdd4b0421727b9eMike Klein    }
247ac04838c58eebbac477895fafdd4b0421727b9eMike Klein
250222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein    bool draw(Src* src) override {
260222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        auto size = src->size();
270222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        surface = SkSurface::MakeRaster(info.makeWH(size.width(), size.height()));
280222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        return src->draw(surface->getCanvas());
297ac04838c58eebbac477895fafdd4b0421727b9eMike Klein    }
307ac04838c58eebbac477895fafdd4b0421727b9eMike Klein
310222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein    sk_sp<SkImage> image() override {
320222e709a3d045077bd6457b25abd854ef5c35c2Mike Klein        return surface->makeImageSnapshot();
337ac04838c58eebbac477895fafdd4b0421727b9eMike Klein    }
347ac04838c58eebbac477895fafdd4b0421727b9eMike Klein};
357ac04838c58eebbac477895fafdd4b0421727b9eMike Kleinstatic Register sw{"sw", SWDst::Create};
3688f9c1eff96a12cfa42db5c238ed42623762d90cMike Klein
3788f9c1eff96a12cfa42db5c238ed42623762d90cMike Kleinstatic Register _565{"565", [](Options options) {
3888f9c1eff96a12cfa42db5c238ed42623762d90cMike Klein    options["ct"] = "565";
3988f9c1eff96a12cfa42db5c238ed42623762d90cMike Klein    return SWDst::Create(options);
4088f9c1eff96a12cfa42db5c238ed42623762d90cMike Klein}};
41