blob: bdec654b52bd46d639ca2e9aeab9d61e863dc385 [file] [log] [blame]
/*
* Copyright (C) 2020-2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "DisplayListItemType.h"
#include "DisplayListItems.h"
namespace WebCore {
namespace DisplayList {
static size_t sizeOfItemInBytes(ItemType type)
{
switch (type) {
case ItemType::Save:
return sizeof(Save);
case ItemType::Restore:
return sizeof(Restore);
case ItemType::Translate:
return sizeof(Translate);
case ItemType::Rotate:
return sizeof(Rotate);
case ItemType::Scale:
return sizeof(Scale);
case ItemType::ConcatenateCTM:
return sizeof(ConcatenateCTM);
case ItemType::SetCTM:
return sizeof(SetCTM);
case ItemType::SetInlineFillColor:
return sizeof(SetInlineFillColor);
case ItemType::SetInlineStrokeColor:
return sizeof(SetInlineStrokeColor);
case ItemType::SetStrokeThickness:
return sizeof(SetStrokeThickness);
case ItemType::SetState:
return sizeof(SetState);
case ItemType::SetLineCap:
return sizeof(SetLineCap);
case ItemType::SetLineDash:
return sizeof(SetLineDash);
case ItemType::SetLineJoin:
return sizeof(SetLineJoin);
case ItemType::SetMiterLimit:
return sizeof(SetMiterLimit);
case ItemType::ClearShadow:
return sizeof(ClearShadow);
case ItemType::Clip:
return sizeof(Clip);
case ItemType::ClipOut:
return sizeof(ClipOut);
case ItemType::ClipToImageBuffer:
return sizeof(ClipToImageBuffer);
case ItemType::ClipOutToPath:
return sizeof(ClipOutToPath);
case ItemType::ClipPath:
return sizeof(ClipPath);
case ItemType::BeginClipToDrawingCommands:
return sizeof(BeginClipToDrawingCommands);
case ItemType::EndClipToDrawingCommands:
return sizeof(EndClipToDrawingCommands);
case ItemType::DrawGlyphs:
return sizeof(DrawGlyphs);
case ItemType::DrawImageBuffer:
return sizeof(DrawImageBuffer);
case ItemType::DrawNativeImage:
return sizeof(DrawNativeImage);
case ItemType::DrawPattern:
return sizeof(DrawPattern);
case ItemType::DrawRect:
return sizeof(DrawRect);
case ItemType::DrawLine:
return sizeof(DrawLine);
case ItemType::DrawLinesForText:
return sizeof(DrawLinesForText);
case ItemType::DrawDotsForDocumentMarker:
return sizeof(DrawDotsForDocumentMarker);
case ItemType::DrawEllipse:
return sizeof(DrawEllipse);
case ItemType::DrawPath:
return sizeof(DrawPath);
case ItemType::DrawFocusRingPath:
return sizeof(DrawFocusRingPath);
case ItemType::DrawFocusRingRects:
return sizeof(DrawFocusRingRects);
case ItemType::FillRect:
return sizeof(FillRect);
case ItemType::FillRectWithColor:
return sizeof(FillRectWithColor);
case ItemType::FillRectWithGradient:
return sizeof(FillRectWithGradient);
case ItemType::FillCompositedRect:
return sizeof(FillCompositedRect);
case ItemType::FillRoundedRect:
return sizeof(FillRoundedRect);
case ItemType::FillRectWithRoundedHole:
return sizeof(FillRectWithRoundedHole);
#if ENABLE(INLINE_PATH_DATA)
case ItemType::FillLine:
return sizeof(FillLine);
case ItemType::FillArc:
return sizeof(FillArc);
case ItemType::FillQuadCurve:
return sizeof(FillQuadCurve);
case ItemType::FillBezierCurve:
return sizeof(FillBezierCurve);
#endif
case ItemType::FillPath:
return sizeof(FillPath);
case ItemType::FillEllipse:
return sizeof(FillEllipse);
case ItemType::FlushContext:
return sizeof(FlushContext);
case ItemType::GetPixelBuffer:
return sizeof(GetPixelBuffer);
case ItemType::PutPixelBuffer:
return sizeof(PutPixelBuffer);
#if ENABLE(VIDEO)
case ItemType::PaintFrameForMedia:
return sizeof(PaintFrameForMedia);
#endif
case ItemType::StrokeRect:
return sizeof(StrokeRect);
case ItemType::StrokeLine:
return sizeof(StrokeLine);
#if ENABLE(INLINE_PATH_DATA)
case ItemType::StrokeArc:
return sizeof(StrokeArc);
case ItemType::StrokeQuadCurve:
return sizeof(StrokeQuadCurve);
case ItemType::StrokeBezierCurve:
return sizeof(StrokeBezierCurve);
#endif
case ItemType::StrokePath:
return sizeof(StrokePath);
case ItemType::StrokeEllipse:
return sizeof(StrokeEllipse);
case ItemType::ClearRect:
return sizeof(ClearRect);
case ItemType::BeginTransparencyLayer:
return sizeof(BeginTransparencyLayer);
case ItemType::EndTransparencyLayer:
return sizeof(EndTransparencyLayer);
#if USE(CG)
case ItemType::ApplyStrokePattern:
return sizeof(ApplyStrokePattern);
case ItemType::ApplyFillPattern:
return sizeof(ApplyFillPattern);
#endif
case ItemType::ApplyDeviceScaleFactor:
return sizeof(ApplyDeviceScaleFactor);
}
ASSERT_NOT_REACHED();
return 0;
}
bool isDrawingItem(ItemType type)
{
/* See the comment at the top of DisplayListItems.h for what this means.
* This needs to match all the "static constexpr bool isDrawingItem"s inside the individual item classes. */
switch (type) {
case ItemType::ApplyDeviceScaleFactor:
#if USE(CG)
case ItemType::ApplyFillPattern:
case ItemType::ApplyStrokePattern:
#endif
case ItemType::ClearShadow:
case ItemType::Clip:
case ItemType::ClipOut:
case ItemType::ClipToImageBuffer:
case ItemType::ClipOutToPath:
case ItemType::ClipPath:
case ItemType::BeginClipToDrawingCommands:
case ItemType::EndClipToDrawingCommands:
case ItemType::ConcatenateCTM:
case ItemType::FlushContext:
case ItemType::Restore:
case ItemType::Rotate:
case ItemType::Save:
case ItemType::Scale:
case ItemType::SetCTM:
case ItemType::SetInlineFillColor:
case ItemType::SetInlineStrokeColor:
case ItemType::SetLineCap:
case ItemType::SetLineDash:
case ItemType::SetLineJoin:
case ItemType::SetMiterLimit:
case ItemType::SetState:
case ItemType::SetStrokeThickness:
case ItemType::Translate:
case ItemType::GetPixelBuffer:
return false;
case ItemType::BeginTransparencyLayer:
case ItemType::ClearRect:
case ItemType::DrawDotsForDocumentMarker:
case ItemType::DrawEllipse:
case ItemType::DrawFocusRingPath:
case ItemType::DrawFocusRingRects:
case ItemType::DrawGlyphs:
case ItemType::DrawImageBuffer:
case ItemType::DrawLine:
case ItemType::DrawLinesForText:
case ItemType::DrawNativeImage:
case ItemType::DrawPattern:
case ItemType::DrawPath:
case ItemType::DrawRect:
case ItemType::EndTransparencyLayer:
case ItemType::FillCompositedRect:
case ItemType::FillEllipse:
#if ENABLE(INLINE_PATH_DATA)
case ItemType::FillLine:
case ItemType::FillArc:
case ItemType::FillQuadCurve:
case ItemType::FillBezierCurve:
#endif
case ItemType::FillPath:
case ItemType::FillRect:
case ItemType::FillRectWithColor:
case ItemType::FillRectWithGradient:
case ItemType::FillRectWithRoundedHole:
case ItemType::FillRoundedRect:
#if ENABLE(VIDEO)
case ItemType::PaintFrameForMedia:
#endif
case ItemType::PutPixelBuffer:
case ItemType::StrokeEllipse:
#if ENABLE(INLINE_PATH_DATA)
case ItemType::StrokeArc:
case ItemType::StrokeQuadCurve:
case ItemType::StrokeBezierCurve:
#endif
case ItemType::StrokePath:
case ItemType::StrokeRect:
case ItemType::StrokeLine:
return true;
}
ASSERT_NOT_REACHED();
return false;
}
size_t paddedSizeOfTypeAndItemInBytes(ItemType type)
{
return sizeof(uint64_t) + roundUpToMultipleOf(alignof(uint64_t), sizeOfItemInBytes(type));
}
size_t paddedSizeOfTypeAndItemInBytes(const DisplayListItem& displayListItem)
{
auto itemSize = std::visit([](const auto& item) {
return sizeof(item);
}, displayListItem);
return sizeof(uint64_t) + roundUpToMultipleOf(alignof(uint64_t), itemSize);
}
ItemType displayListItemType(const DisplayListItem& displayListItem)
{
return std::visit([](const auto& item) {
return item.itemType;
}, displayListItem);
}
bool isInlineItem(ItemType type)
{
/* See the comment at the top of DisplayListItems.h for what this means.
* This needs to match (1) RemoteImageBufferProxy::encodeItem(), (2) RemoteRenderingBackend::decodeItem(),
* and (3) all the "static constexpr bool isInlineItem"s inside the individual item classes. */
switch (type) {
case ItemType::BeginClipToDrawingCommands:
case ItemType::ClipOutToPath:
case ItemType::ClipPath:
case ItemType::DrawFocusRingPath:
case ItemType::DrawFocusRingRects:
case ItemType::DrawGlyphs:
case ItemType::DrawLinesForText:
case ItemType::DrawPath:
case ItemType::FillCompositedRect:
case ItemType::FillPath:
case ItemType::FillRectWithColor:
case ItemType::FillRectWithGradient:
case ItemType::FillRectWithRoundedHole:
case ItemType::FillRoundedRect:
case ItemType::GetPixelBuffer:
case ItemType::PutPixelBuffer:
case ItemType::SetLineDash:
case ItemType::SetState:
case ItemType::StrokePath:
return false;
case ItemType::ApplyDeviceScaleFactor:
#if USE(CG)
case ItemType::ApplyFillPattern:
case ItemType::ApplyStrokePattern:
#endif
case ItemType::BeginTransparencyLayer:
case ItemType::ClearRect:
case ItemType::ClearShadow:
case ItemType::Clip:
case ItemType::ClipOut:
case ItemType::ClipToImageBuffer:
case ItemType::EndClipToDrawingCommands:
case ItemType::ConcatenateCTM:
case ItemType::DrawDotsForDocumentMarker:
case ItemType::DrawEllipse:
case ItemType::DrawImageBuffer:
case ItemType::DrawNativeImage:
case ItemType::DrawPattern:
case ItemType::DrawLine:
case ItemType::DrawRect:
case ItemType::EndTransparencyLayer:
case ItemType::FillEllipse:
#if ENABLE(INLINE_PATH_DATA)
case ItemType::FillLine:
case ItemType::FillArc:
case ItemType::FillQuadCurve:
case ItemType::FillBezierCurve:
#endif
case ItemType::FillRect:
case ItemType::FlushContext:
#if ENABLE(VIDEO)
case ItemType::PaintFrameForMedia:
#endif
case ItemType::Restore:
case ItemType::Rotate:
case ItemType::Save:
case ItemType::Scale:
case ItemType::SetCTM:
case ItemType::SetInlineFillColor:
case ItemType::SetInlineStrokeColor:
case ItemType::SetLineCap:
case ItemType::SetLineJoin:
case ItemType::SetMiterLimit:
case ItemType::SetStrokeThickness:
case ItemType::StrokeEllipse:
#if ENABLE(INLINE_PATH_DATA)
case ItemType::StrokeArc:
case ItemType::StrokeQuadCurve:
case ItemType::StrokeBezierCurve:
#endif
case ItemType::StrokeRect:
case ItemType::StrokeLine:
case ItemType::Translate:
return true;
}
ASSERT_NOT_REACHED();
return false;
}
} // namespace DisplayList
} // namespace WebCore