// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/shell/common/surface.h" #include "lib/fxl/logging.h" #include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" #include "third_party/skia/include/core/SkSurface.h" namespace shell { SurfaceFrame::SurfaceFrame(sk_sp surface, SubmitCallback submit_callback) : submitted_(false), surface_(surface), submit_callback_(submit_callback) { FXL_DCHECK(submit_callback_); if (surface_) { xform_canvas_ = SkCreateColorSpaceXformCanvas(surface_->getCanvas(), SkColorSpace::MakeSRGB()); } } SurfaceFrame::~SurfaceFrame() { if (submit_callback_) { // Dropping without a Submit. submit_callback_(*this, nullptr); } } bool SurfaceFrame::Submit() { if (submitted_) { return false; } submitted_ = PerformSubmit(); return submitted_; } SkCanvas* SurfaceFrame::SkiaCanvas() { if (xform_canvas_) { return xform_canvas_.get(); } return surface_ != nullptr ? surface_->getCanvas() : nullptr; } sk_sp SurfaceFrame::SkiaSurface() const { return surface_; } bool SurfaceFrame::PerformSubmit() { if (submit_callback_ == nullptr) { return false; } if (submit_callback_(*this, SkiaCanvas())) { return true; } return false; } Surface::Surface() : scale_(1.0) {} Surface::~Surface() = default; bool Surface::SupportsScaling() const { return false; } double Surface::GetScale() const { return scale_; } void Surface::SetScale(double scale) { static constexpr double kMaxScale = 1.0; static constexpr double kMinScale = 0.25; if (scale > kMaxScale) { scale = kMaxScale; } else if (scale < kMinScale) { scale = kMinScale; } scale_ = scale; } } // namespace shell