blob: 82cc7572596e06db94df34350b3630e34051cc60 [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 "core/css/CSSPaintValue.h"
#include "core/css/CSSCustomIdentValue.h"
#include "core/layout/LayoutObject.h"
#include "platform/graphics/Image.h"
#include "wtf/text/StringBuilder.h"
namespace blink {
CSSPaintValue::CSSPaintValue(CSSCustomIdentValue* name)
: CSSImageGeneratorValue(PaintClass)
, m_name(name)
, m_paintImageGeneratorObserver(new Observer(this))
{
}
CSSPaintValue::~CSSPaintValue()
{
}
String CSSPaintValue::customCSSText() const
{
StringBuilder result;
result.append("paint(");
result.append(m_name->customCSSText());
result.append(')');
return result.toString();
}
String CSSPaintValue::name() const
{
return m_name->value();
}
PassRefPtr<Image> CSSPaintValue::image(const LayoutObject& layoutObject, const IntSize& size)
{
if (!m_generator)
m_generator = CSSPaintImageGenerator::create(name(), layoutObject.document(), m_paintImageGeneratorObserver);
return m_generator->paint(layoutObject, size);
}
void CSSPaintValue::Observer::paintImageGeneratorReady()
{
m_ownerValue->paintImageGeneratorReady();
}
void CSSPaintValue::paintImageGeneratorReady()
{
for (const LayoutObject* client : clients().keys()) {
const_cast<LayoutObject*>(client)->imageChanged(static_cast<WrappedImagePtr>(this));
}
}
bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const
{
return m_generator && !m_generator->hasAlpha();
}
bool CSSPaintValue::equals(const CSSPaintValue& other) const
{
return name() == other.name();
}
DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue)
{
visitor->trace(m_name);
visitor->trace(m_generator);
visitor->trace(m_paintImageGeneratorObserver);
CSSImageGeneratorValue::traceAfterDispatch(visitor);
}
} // namespace blink