blob: 920e896fd5b4fda6a16584ade9db899e2ff8c336 [file] [log] [blame]
// 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 "modules/imagebitmap/ImageBitmapRenderingContext.h"
#include "bindings/modules/v8/RenderingContext.h"
#include "core/frame/ImageBitmap.h"
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/StaticBitmapImage.h"
#include "platform/graphics/gpu/ImageLayerBridge.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkSurface.h"
namespace blink {
ImageBitmapRenderingContext::ImageBitmapRenderingContext(
CanvasRenderingContextHost* host,
const CanvasContextCreationAttributes& attrs)
: CanvasRenderingContext(host, attrs),
image_layer_bridge_(
new ImageLayerBridge(attrs.alpha() ? kNonOpaque : kOpaque)) {}
ImageBitmapRenderingContext::~ImageBitmapRenderingContext() {}
void ImageBitmapRenderingContext::SetCanvasGetContextResult(
RenderingContext& result) {
result.setImageBitmapRenderingContext(this);
}
void ImageBitmapRenderingContext::transferFromImageBitmap(
ImageBitmap* image_bitmap,
ExceptionState& exception_state) {
if (image_bitmap && image_bitmap->IsNeutered()) {
exception_state.ThrowDOMException(
kInvalidStateError, "The input ImageBitmap has been detached");
return;
}
image_layer_bridge_->SetImage(image_bitmap ? image_bitmap->BitmapImage()
: nullptr);
DidDraw();
if (image_bitmap)
image_bitmap->close();
}
CanvasRenderingContext* ImageBitmapRenderingContext::Factory::Create(
CanvasRenderingContextHost* host,
const CanvasContextCreationAttributes& attrs) {
if (!RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled())
return nullptr;
return new ImageBitmapRenderingContext(host, attrs);
}
void ImageBitmapRenderingContext::Stop() {
image_layer_bridge_->Dispose();
}
PassRefPtr<Image> ImageBitmapRenderingContext::GetImage(AccelerationHint,
SnapshotReason) const {
return image_layer_bridge_->GetImage();
}
WebLayer* ImageBitmapRenderingContext::PlatformLayer() const {
return image_layer_bridge_->PlatformLayer();
}
bool ImageBitmapRenderingContext::IsPaintable() const {
return !!image_layer_bridge_->GetImage();
}
DEFINE_TRACE(ImageBitmapRenderingContext) {
visitor->Trace(image_layer_bridge_);
CanvasRenderingContext::Trace(visitor);
}
bool ImageBitmapRenderingContext::IsAccelerated() const {
return image_layer_bridge_->IsAccelerated();
}
} // blink