CSSPaintImageValue.cpp [plain text]
#include "config.h"
#include "CSSPaintImageValue.h"
#if ENABLE(CSS_PAINTING_API)
#include "CSSVariableData.h"
#include "CustomPaintImage.h"
#include "PaintWorkletGlobalScope.h"
#include "RenderElement.h"
#include <wtf/text/StringBuilder.h>
namespace WebCore {
String CSSPaintImageValue::customCSSText() const
{
StringBuilder result;
result.appendLiteral("paint(");
result.append(m_name);
result.append(')');
return result.toString();
}
RefPtr<Image> CSSPaintImageValue::image(RenderElement& renderElement, const FloatSize& size)
{
if (size.isEmpty())
return nullptr;
auto* selectedGlobalScope = renderElement.document().paintWorkletGlobalScopeForName(m_name);
if (!selectedGlobalScope)
return nullptr;
auto locker = holdLock(selectedGlobalScope->paintDefinitionLock());
auto* registration = selectedGlobalScope->paintDefinitionMap().get(m_name);
if (!registration)
return nullptr;
Vector<String> arguments;
CSSParserTokenRange localRange(m_arguments->tokenRange());
while (!localRange.atEnd()) {
StringBuilder builder;
while (!localRange.atEnd() && localRange.peek() != CommaToken) {
if (localRange.peek() == CommentToken)
localRange.consume();
else if (localRange.peek().getBlockType() == CSSParserToken::BlockStart) {
localRange.peek().serialize(builder);
builder.append(localRange.consumeBlock().serialize());
builder.append(')');
} else
localRange.consume().serialize(builder);
}
if (!localRange.atEnd())
localRange.consume(); arguments.append(builder.toString());
}
return CustomPaintImage::create(*registration, size, renderElement, arguments);
}
}
#endif