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

#include "experimental/graphite/src/Surface_Graphite.h"

#include "experimental/graphite/include/SkStuff.h"
#include "experimental/graphite/src/Device.h"
#include "experimental/graphite/src/Image_Graphite.h"
#include "experimental/graphite/src/Recorder.h"

namespace skgpu {

Surface_Graphite::Surface_Graphite(sk_sp<Device> device)
        : SkSurface_Base(device->width(), device->height(), &device->surfaceProps())
        , fDevice(std::move(device)) {
}

Surface_Graphite::~Surface_Graphite() {}

SkCanvas* Surface_Graphite::onNewCanvas() { return new SkCanvas(fDevice); }

sk_sp<SkSurface> Surface_Graphite::onNewSurface(const SkImageInfo& ii) {
    return MakeGraphite(fDevice->refRecorder(), ii);
}

sk_sp<SkImage> Surface_Graphite::onNewImageSnapshot(const SkIRect* subset) {
    SkImageInfo ii = subset ? this->imageInfo().makeDimensions(subset->size())
                            : this->imageInfo();

    return sk_sp<Image_Graphite>(new Image_Graphite(ii));
}

void Surface_Graphite::onWritePixels(const SkPixmap&, int x, int y) {}
bool Surface_Graphite::onCopyOnWrite(ContentChangeMode) { return true; }

} // namespace skgpu
