blob: c1e316d4b57c2833eddd83c0984a19e7317059db [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/csspaint/CSSPaintImageGeneratorImpl.h"
#include "core/dom/Document.h"
#include "core/frame/LocalDOMWindow.h"
#include "modules/csspaint/CSSPaintDefinition.h"
#include "modules/csspaint/PaintWorklet.h"
#include "modules/csspaint/WindowPaintWorklet.h"
#include "platform/graphics/Image.h"
namespace blink {
CSSPaintImageGenerator* CSSPaintImageGeneratorImpl::Create(
const String& name,
const Document& document,
Observer* observer) {
LocalDOMWindow* dom_window = document.domWindow();
PaintWorklet* paint_worklet =
WindowPaintWorklet::From(*dom_window).paintWorklet();
CSSPaintDefinition* paint_definition = paint_worklet->FindDefinition(name);
CSSPaintImageGeneratorImpl* generator;
if (!paint_definition) {
generator = new CSSPaintImageGeneratorImpl(observer);
paint_worklet->AddPendingGenerator(name, generator);
} else {
generator = new CSSPaintImageGeneratorImpl(paint_definition);
}
return generator;
}
CSSPaintImageGeneratorImpl::CSSPaintImageGeneratorImpl(
CSSPaintDefinition* definition)
: definition_(definition) {}
CSSPaintImageGeneratorImpl::CSSPaintImageGeneratorImpl(Observer* observer)
: observer_(observer) {}
CSSPaintImageGeneratorImpl::~CSSPaintImageGeneratorImpl() {}
void CSSPaintImageGeneratorImpl::SetDefinition(CSSPaintDefinition* definition) {
DCHECK(!definition_);
definition_ = definition;
DCHECK(observer_);
observer_->PaintImageGeneratorReady();
}
PassRefPtr<Image> CSSPaintImageGeneratorImpl::Paint(
const ImageResourceObserver& observer,
const IntSize& size,
const CSSStyleValueVector* data) {
return definition_ ? definition_->Paint(observer, size, data) : nullptr;
}
const Vector<CSSPropertyID>&
CSSPaintImageGeneratorImpl::NativeInvalidationProperties() const {
DEFINE_STATIC_LOCAL(Vector<CSSPropertyID>, empty_vector, ());
return definition_ ? definition_->NativeInvalidationProperties()
: empty_vector;
}
const Vector<AtomicString>&
CSSPaintImageGeneratorImpl::CustomInvalidationProperties() const {
DEFINE_STATIC_LOCAL(Vector<AtomicString>, empty_vector, ());
return definition_ ? definition_->CustomInvalidationProperties()
: empty_vector;
}
bool CSSPaintImageGeneratorImpl::HasAlpha() const {
return definition_ && definition_->HasAlpha();
}
const Vector<CSSSyntaxDescriptor>&
CSSPaintImageGeneratorImpl::InputArgumentTypes() const {
DEFINE_STATIC_LOCAL(Vector<CSSSyntaxDescriptor>, empty_vector, ());
return definition_ ? definition_->InputArgumentTypes() : empty_vector;
}
bool CSSPaintImageGeneratorImpl::IsImageGeneratorReady() const {
return definition_;
}
DEFINE_TRACE(CSSPaintImageGeneratorImpl) {
visitor->Trace(definition_);
visitor->Trace(observer_);
CSSPaintImageGenerator::Trace(visitor);
}
} // namespace blink