2 * Copyright (C) 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef DisplayListItems_h
27 #define DisplayListItems_h
29 #include "FloatPoint.h"
30 #include "FloatRect.h"
31 #include "FloatRoundedRect.h"
33 #include "GlyphBuffer.h"
34 #include "GraphicsContext.h"
36 #include <wtf/RefCounted.h>
37 #include <wtf/TypeCasts.h>
40 #include "GraphicsContextPlatformPrivateCG.h"
46 struct ImagePaintingOptions;
48 namespace DisplayList {
71 #if USE(CG) || USE(CAIRO)
78 DrawLineForDocumentMarker,
88 FillRectWithRoundedHole,
95 BeginTransparencyLayer,
98 ApplyStrokePattern, // FIXME: should not be a recorded item.
99 ApplyFillPattern, // FIXME: should not be a recorded item.
101 ApplyDeviceScaleFactor,
104 class Item : public RefCounted<Item> {
115 ItemType type() const
120 virtual void apply(GraphicsContext&) const = 0;
122 static constexpr bool isDisplayListItem = true;
124 virtual bool isDrawingItem() const { return false; }
126 // A state item is one preserved by Save/Restore.
127 bool isStateItem() const
129 return isStateItemType(m_type);
132 static bool isStateItemType(ItemType itemType)
135 case ItemType:: Translate:
136 case ItemType:: Rotate:
137 case ItemType:: Scale:
138 case ItemType:: ConcatenateCTM:
139 case ItemType:: SetState:
140 case ItemType:: SetLineCap:
141 case ItemType:: SetLineDash:
142 case ItemType:: SetLineJoin:
143 case ItemType:: SetMiterLimit:
144 case ItemType:: ClearShadow:
152 #if !defined(NDEBUG) || !LOG_DISABLED
153 WTF::CString description() const;
155 static size_t sizeInBytes(const Item&);
161 class DrawingItem : public Item {
163 DrawingItem(ItemType type)
168 void setExtent(const FloatRect& r) { m_extent = r; }
169 const FloatRect& extent() const { return m_extent.value(); }
171 bool extentKnown() const { return static_cast<bool>(m_extent); }
173 // Return bounds of this drawing operation in local coordinates.
174 // Does not include effets of transform, shadow etc in the state.
175 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const { return Nullopt; }
178 virtual bool isDrawingItem() const { return true; }
180 Optional<FloatRect> m_extent; // In base coordinates, taking shadows and transforms into account.
183 class Save : public Item {
185 static Ref<Save> create()
187 return adoptRef(*new Save);
190 // Index in the display list of the corresponding Restore item. 0 if unmatched.
191 size_t restoreIndex() const { return m_restoreIndex; }
192 void setRestoreIndex(size_t index) { m_restoreIndex = index; }
196 : Item(ItemType::Save)
200 virtual void apply(GraphicsContext&) const override;
202 size_t m_restoreIndex { 0 };
205 class Restore : public Item {
207 static Ref<Restore> create()
209 return adoptRef(*new Restore);
214 : Item(ItemType::Restore)
218 virtual void apply(GraphicsContext&) const override;
221 class Translate : public Item {
223 static Ref<Translate> create(float x, float y)
225 return adoptRef(*new Translate(x, y));
228 float x() const { return m_x; }
229 float y() const { return m_y; }
232 Translate(float x, float y)
233 : Item(ItemType::Translate)
239 virtual void apply(GraphicsContext&) const override;
245 class Rotate : public Item {
247 static Ref<Rotate> create(float angleInRadians)
249 return adoptRef(*new Rotate(angleInRadians));
252 float angle() const { return m_angle; }
256 : Item(ItemType::Rotate)
261 virtual void apply(GraphicsContext&) const override;
263 float m_angle; // In radians.
266 class Scale : public Item {
268 static Ref<Scale> create(const FloatSize& size)
270 return adoptRef(*new Scale(size));
273 const FloatSize& amount() const { return m_size; }
276 Scale(const FloatSize& size)
277 : Item(ItemType::Scale)
282 virtual void apply(GraphicsContext&) const override;
287 class ConcatenateCTM : public Item {
289 static Ref<ConcatenateCTM> create(const AffineTransform& matrix)
291 return adoptRef(*new ConcatenateCTM(matrix));
294 const AffineTransform& transform() const { return m_transform; }
297 ConcatenateCTM(const AffineTransform&);
299 virtual void apply(GraphicsContext&) const override;
301 AffineTransform m_transform;
304 class SetState : public Item {
306 static Ref<SetState> create(const GraphicsContextState& state, GraphicsContextState::StateChangeFlags flags)
308 return adoptRef(*new SetState(state, flags));
311 const GraphicsContextStateChange& state() const { return m_state; }
313 void accumulate(const GraphicsContextState&, GraphicsContextState::StateChangeFlags);
315 void accumulate(GraphicsContextState&) const;
317 static void applyState(GraphicsContext&, const GraphicsContextState&, GraphicsContextState::StateChangeFlags);
319 static void dumpStateChanges(TextStream&, const GraphicsContextState&, GraphicsContextState::StateChangeFlags);
321 SetState(const GraphicsContextState& state, GraphicsContextState::StateChangeFlags flags)
322 : Item(ItemType::SetState)
323 , m_state(state, flags)
327 virtual void apply(GraphicsContext&) const override;
329 GraphicsContextStateChange m_state;
332 class SetLineCap : public Item {
334 static Ref<SetLineCap> create(LineCap lineCap)
336 return adoptRef(*new SetLineCap(lineCap));
339 LineCap lineCap() const { return m_lineCap; }
342 SetLineCap(LineCap lineCap)
343 : Item(ItemType::SetLineCap)
348 virtual void apply(GraphicsContext&) const override;
353 class SetLineDash : public Item {
355 static Ref<SetLineDash> create(const DashArray& dashArray, float dashOffset)
357 return adoptRef(*new SetLineDash(dashArray, dashOffset));
360 const DashArray& dashArray() const { return m_dashArray; }
361 float dashOffset() const { return m_dashOffset; }
364 SetLineDash(const DashArray& dashArray, float dashOffset)
365 : Item(ItemType::SetLineDash)
366 , m_dashArray(dashArray)
367 , m_dashOffset(dashOffset)
371 virtual void apply(GraphicsContext&) const override;
373 DashArray m_dashArray;
377 class SetLineJoin : public Item {
379 static Ref<SetLineJoin> create(LineJoin lineJoin)
381 return adoptRef(*new SetLineJoin(lineJoin));
384 LineJoin lineJoin() const { return m_lineJoin; }
387 SetLineJoin(LineJoin lineJoin)
388 : Item(ItemType::SetLineJoin)
389 , m_lineJoin(lineJoin)
393 virtual void apply(GraphicsContext&) const override;
398 class SetMiterLimit : public Item {
400 static Ref<SetMiterLimit> create(float limit)
402 return adoptRef(*new SetMiterLimit(limit));
405 float miterLimit() const { return m_miterLimit; }
408 SetMiterLimit(float miterLimit)
409 : Item(ItemType::SetMiterLimit)
410 , m_miterLimit(miterLimit)
414 virtual void apply(GraphicsContext&) const override;
419 class ClearShadow : public Item {
421 static Ref<ClearShadow> create()
423 return adoptRef(*new ClearShadow);
428 : Item(ItemType::ClearShadow)
432 virtual void apply(GraphicsContext&) const override;
435 // FIXME: treat as DrawingItem?
436 class Clip : public Item {
438 static Ref<Clip> create(const FloatRect& rect)
440 return adoptRef(*new Clip(rect));
443 FloatRect rect() const { return m_rect; }
446 Clip(const FloatRect& rect)
447 : Item(ItemType::Clip)
452 virtual void apply(GraphicsContext&) const override;
457 class ClipOut : public Item {
459 static Ref<ClipOut> create(const FloatRect& rect)
461 return adoptRef(*new ClipOut(rect));
464 FloatRect rect() const { return m_rect; }
467 ClipOut(const FloatRect& rect)
468 : Item(ItemType::ClipOut)
473 virtual void apply(GraphicsContext&) const override;
478 class ClipOutToPath : public Item {
480 static Ref<ClipOutToPath> create(const Path& path)
482 return adoptRef(*new ClipOutToPath(path));
485 const Path& path() const { return m_path; }
488 ClipOutToPath(const Path& path)
489 : Item(ItemType::ClipOutToPath)
494 virtual void apply(GraphicsContext&) const override;
499 class ClipPath : public Item {
501 static Ref<ClipPath> create(const Path& path, WindRule windRule)
503 return adoptRef(*new ClipPath(path, windRule));
506 const Path& path() const { return m_path; }
507 WindRule windRule() const { return m_windRule; }
510 ClipPath(const Path& path, WindRule windRule)
511 : Item(ItemType::ClipPath)
513 , m_windRule(windRule)
517 virtual void apply(GraphicsContext&) const override;
523 class DrawGlyphs : public DrawingItem {
525 static Ref<DrawGlyphs> create(const Font& font, const GlyphBufferGlyph* glyphs, const GlyphBufferAdvance* advances, unsigned count, const FloatPoint& blockLocation, const FloatSize& localAnchor, FontSmoothingMode smoothingMode)
527 return adoptRef(*new DrawGlyphs(font, glyphs, advances, count, blockLocation, localAnchor, smoothingMode));
530 const FloatPoint& blockLocation() const { return m_blockLocation; }
531 void setBlockLocation(const FloatPoint& blockLocation) { m_blockLocation = blockLocation; }
533 const FloatSize& localAnchor() const { return m_localAnchor; }
535 FloatPoint anchorPoint() const { return m_blockLocation + m_localAnchor; }
537 const Vector<GlyphBufferGlyph, 128>& glyphs() const { return m_glyphs; }
540 DrawGlyphs(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned count, const FloatPoint& blockLocation, const FloatSize& localAnchor, FontSmoothingMode);
542 void computeBounds();
544 virtual void apply(GraphicsContext&) const override;
546 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
548 GlyphBuffer generateGlyphBuffer() const;
551 Vector<GlyphBufferGlyph, 128> m_glyphs;
552 Vector<GlyphBufferAdvance, 128> m_advances;
554 FloatPoint m_blockLocation;
555 FloatSize m_localAnchor;
556 FontSmoothingMode m_smoothingMode;
559 class DrawImage : public DrawingItem {
561 static Ref<DrawImage> create(Image& image, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& imagePaintingOptions)
563 return adoptRef(*new DrawImage(image, destination, source, imagePaintingOptions));
566 const Image& image() const { return m_image.get(); }
567 FloatRect source() const { return m_source; }
568 FloatRect destination() const { return m_destination; }
571 DrawImage(Image&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&);
573 virtual void apply(GraphicsContext&) const override;
575 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_destination; }
577 mutable Ref<Image> m_image; // FIXME: Drawing images can cause their animations to progress. This shouldn't have to be mutable.
578 FloatRect m_destination;
580 ImagePaintingOptions m_imagePaintingOptions;
583 class DrawTiledImage : public DrawingItem {
585 static Ref<DrawTiledImage> create(Image& image, const FloatRect& destination, const FloatPoint& source, const FloatSize& tileSize, const FloatSize& spacing, const ImagePaintingOptions& imagePaintingOptions)
587 return adoptRef(*new DrawTiledImage(image, destination, source, tileSize, spacing, imagePaintingOptions));
590 const Image& image() const { return m_image.get(); }
591 FloatPoint source() const { return m_source; }
592 FloatRect destination() const { return m_destination; }
594 FloatSize tileSize() const { return m_tileSize; }
595 FloatSize spacing() const { return m_spacing; }
598 DrawTiledImage(Image&, const FloatRect& destination, const FloatPoint& source, const FloatSize& tileSize, const FloatSize& spacing, const ImagePaintingOptions&);
600 virtual void apply(GraphicsContext&) const override;
602 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_destination; }
604 mutable Ref<Image> m_image; // FIXME: Drawing images can cause their animations to progress. This shouldn't have to be mutable.
605 FloatRect m_destination;
607 FloatSize m_tileSize;
609 ImagePaintingOptions m_imagePaintingOptions;
612 class DrawTiledScaledImage : public DrawingItem {
614 static Ref<DrawTiledScaledImage> create(Image& image, const FloatRect& destination, const FloatRect& source, const FloatSize& tileScaleFactor, Image::TileRule hRule, Image::TileRule vRule, const ImagePaintingOptions& imagePaintingOptions)
616 return adoptRef(*new DrawTiledScaledImage(image, destination, source, tileScaleFactor, hRule, vRule, imagePaintingOptions));
619 const Image& image() const { return m_image.get(); }
620 FloatRect source() const { return m_source; }
621 FloatRect destination() const { return m_destination; }
624 DrawTiledScaledImage(Image&, const FloatRect& destination, const FloatRect& source, const FloatSize& tileScaleFactor, Image::TileRule hRule, Image::TileRule vRule, const ImagePaintingOptions&);
626 virtual void apply(GraphicsContext&) const override;
628 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_destination; }
630 mutable Ref<Image> m_image; // FIXME: Drawing images can cause their animations to progress. This shouldn't have to be mutable.
631 FloatRect m_destination;
633 FloatSize m_tileScaleFactor;
634 Image::TileRule m_hRule;
635 Image::TileRule m_vRule;
636 ImagePaintingOptions m_imagePaintingOptions;
639 #if USE(CG) || USE(CAIRO)
640 class DrawNativeImage : public DrawingItem {
642 static Ref<DrawNativeImage> create(PassNativeImagePtr imagePtr, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator op, BlendMode blendMode, ImageOrientation orientation)
644 return adoptRef(*new DrawNativeImage(imagePtr, imageSize, destRect, srcRect, op, blendMode, orientation));
647 FloatRect source() const { return m_srcRect; }
648 FloatRect destination() const { return m_destination; }
651 DrawNativeImage(PassNativeImagePtr, const FloatSize& selfSize, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator, BlendMode, ImageOrientation);
653 virtual void apply(GraphicsContext&) const override;
655 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_destination; }
658 RetainPtr<CGImageRef> m_imagePtr;
660 FloatSize m_imageSize;
661 FloatRect m_destination;
664 CompositeOperator m_op;
665 BlendMode m_blendMode;
667 ImageOrientation m_orientation;
671 class DrawPattern : public DrawingItem {
673 static Ref<DrawPattern> create(Image& image, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, CompositeOperator op, const FloatRect& destRect, BlendMode blendMode)
675 return adoptRef(*new DrawPattern(image, tileRect, patternTransform, phase, spacing, op, destRect, blendMode));
678 const Image& image() const { return m_image.get(); }
679 const AffineTransform& patternTransform() const { return m_patternTransform; }
680 FloatRect tileRect() const { return m_tileRect; }
681 FloatRect destRect() const { return m_destination; }
682 FloatPoint phase() const { return m_phase; }
683 FloatSize spacing() const { return m_spacing; }
686 DrawPattern(Image&, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, CompositeOperator, const FloatRect& destRect, BlendMode = BlendModeNormal);
688 virtual void apply(GraphicsContext&) const override;
690 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_destination; }
692 mutable Ref<Image> m_image; // FIXME: Drawing images can cause their animations to progress. This shouldn't have to be mutable.
693 AffineTransform m_patternTransform;
694 FloatRect m_tileRect;
695 FloatRect m_destination;
698 CompositeOperator m_op;
699 BlendMode m_blendMode;
702 // Is DrawingItem because the size of the transparency layer is implicitly the clip bounds.
703 class BeginTransparencyLayer : public DrawingItem {
705 static Ref<BeginTransparencyLayer> create(float opacity)
707 return adoptRef(*new BeginTransparencyLayer(opacity));
710 float opacity() const { return m_opacity; }
713 BeginTransparencyLayer(float opacity)
714 : DrawingItem(ItemType::BeginTransparencyLayer)
719 virtual void apply(GraphicsContext&) const override;
724 class EndTransparencyLayer : public DrawingItem {
726 static Ref<EndTransparencyLayer> create()
728 return adoptRef(*new EndTransparencyLayer);
732 EndTransparencyLayer()
733 : DrawingItem(ItemType::EndTransparencyLayer)
737 virtual void apply(GraphicsContext&) const override;
740 class DrawRect : public DrawingItem {
742 static Ref<DrawRect> create(const FloatRect& rect, float borderThickness)
744 return adoptRef(*new DrawRect(rect, borderThickness));
747 FloatRect rect() const { return m_rect; }
748 float borderThickness() const { return m_borderThickness; }
751 DrawRect(const FloatRect& rect, float borderThickness)
752 : DrawingItem(ItemType::DrawRect)
754 , m_borderThickness(borderThickness)
758 virtual void apply(GraphicsContext&) const override;
759 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
762 float m_borderThickness;
765 class DrawLine : public DrawingItem {
767 static Ref<DrawLine> create(const FloatPoint& point1, const FloatPoint& point2)
769 return adoptRef(*new DrawLine(point1, point2));
772 FloatPoint point1() const { return m_point1; }
773 FloatPoint point2() const { return m_point2; }
776 DrawLine(const FloatPoint& point1, const FloatPoint& point2)
777 : DrawingItem(ItemType::DrawLine)
783 virtual void apply(GraphicsContext&) const override;
784 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
790 class DrawLinesForText : public DrawingItem {
792 static Ref<DrawLinesForText> create(const FloatPoint& blockLocation, const FloatSize& localAnchor, const DashArray& widths, bool printing, bool doubleLines, float strokeWidth)
794 return adoptRef(*new DrawLinesForText(blockLocation, localAnchor, widths, printing, doubleLines, strokeWidth));
797 void setBlockLocation(const FloatPoint& blockLocation) { m_blockLocation = blockLocation; }
798 const FloatPoint& blockLocation() const { return m_blockLocation; }
799 const FloatSize& localAnchor() const { return m_localAnchor; }
800 FloatPoint point() const { return m_blockLocation + m_localAnchor; }
801 const DashArray& widths() const { return m_widths; }
802 bool isPrinting() const { return m_printing; }
803 bool doubleLines() const { return m_doubleLines; }
806 DrawLinesForText(const FloatPoint& blockLocation, const FloatSize& localAnchor, const DashArray& widths, bool printing, bool doubleLines, float strokeWidth)
807 : DrawingItem(ItemType::DrawLinesForText)
808 , m_blockLocation(blockLocation)
809 , m_localAnchor(localAnchor)
811 , m_strokeWidth(strokeWidth)
812 , m_printing(printing)
813 , m_doubleLines(doubleLines)
817 virtual void apply(GraphicsContext&) const override;
819 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
821 FloatPoint m_blockLocation;
822 FloatSize m_localAnchor;
829 class DrawLineForDocumentMarker : public DrawingItem {
831 static Ref<DrawLineForDocumentMarker> create(const FloatPoint& point, float width, GraphicsContext::DocumentMarkerLineStyle style)
833 return adoptRef(*new DrawLineForDocumentMarker(point, width, style));
836 FloatPoint point() const { return m_point; }
837 float width() const { return m_width; }
840 DrawLineForDocumentMarker(const FloatPoint& point, float width, GraphicsContext::DocumentMarkerLineStyle style)
841 : DrawingItem(ItemType::DrawLineForDocumentMarker)
848 virtual void apply(GraphicsContext&) const override;
850 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
854 GraphicsContext::DocumentMarkerLineStyle m_style;
857 class DrawEllipse : public DrawingItem {
859 static Ref<DrawEllipse> create(const FloatRect& rect)
861 return adoptRef(*new DrawEllipse(rect));
864 FloatRect rect() const { return m_rect; }
867 DrawEllipse(const FloatRect& rect)
868 : DrawingItem(ItemType::DrawEllipse)
873 virtual void apply(GraphicsContext&) const override;
874 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
879 class DrawPath : public DrawingItem {
881 static Ref<DrawPath> create(const Path& path)
883 return adoptRef(*new DrawPath(path));
886 const Path& path() const { return m_path; }
889 DrawPath(const Path& path)
890 : DrawingItem(ItemType::DrawPath)
895 virtual void apply(GraphicsContext&) const override;
897 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_path.fastBoundingRect(); }
902 class DrawFocusRingPath : public DrawingItem {
904 static Ref<DrawFocusRingPath> create(const Path& path, int width, int offset, const Color& color)
906 return adoptRef(*new DrawFocusRingPath(path, width, offset, color));
909 const Path& path() const { return m_path; }
910 int width() const { return m_width; }
911 int offset() const { return m_offset; }
912 Color color() const { return m_color; }
915 DrawFocusRingPath(const Path& path, int width, int offset, const Color& color)
916 : DrawingItem(ItemType::DrawFocusRingPath)
924 virtual void apply(GraphicsContext&) const override;
926 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
934 class DrawFocusRingRects : public DrawingItem {
936 static Ref<DrawFocusRingRects> create(const Vector<IntRect>& rects, int width, int offset, const Color& color)
938 return adoptRef(*new DrawFocusRingRects(rects, width, offset, color));
941 const Vector<IntRect> rects() const { return m_rects; }
942 int width() const { return m_width; }
943 int offset() const { return m_offset; }
944 Color color() const { return m_color; }
947 DrawFocusRingRects(const Vector<IntRect>& rects, int width, int offset, const Color& color)
948 : DrawingItem(ItemType::DrawFocusRingRects)
956 virtual void apply(GraphicsContext&) const override;
958 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
960 Vector<IntRect> m_rects;
966 class FillRect : public DrawingItem {
968 static Ref<FillRect> create(const FloatRect& rect)
970 return adoptRef(*new FillRect(rect));
973 FloatRect rect() const { return m_rect; }
976 FillRect(const FloatRect& rect)
977 : DrawingItem(ItemType::FillRect)
982 virtual void apply(GraphicsContext&) const override;
983 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
988 // FIXME: Make these inherit from FillRect proper.
989 class FillRectWithColor : public DrawingItem {
991 static Ref<FillRectWithColor> create(const FloatRect& rect, const Color& color)
993 return adoptRef(*new FillRectWithColor(rect, color));
996 FloatRect rect() const { return m_rect; }
997 Color color() const { return m_color; }
1000 FillRectWithColor(const FloatRect& rect, const Color& color)
1001 : DrawingItem(ItemType::FillRectWithColor)
1007 virtual void apply(GraphicsContext&) const override;
1008 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1014 class FillRectWithGradient : public DrawingItem {
1016 static Ref<FillRectWithGradient> create(const FloatRect& rect, Gradient& gradient)
1018 return adoptRef(*new FillRectWithGradient(rect, gradient));
1021 FloatRect rect() const { return m_rect; }
1024 FillRectWithGradient(const FloatRect& rect, Gradient& gradient)
1025 : DrawingItem(ItemType::FillRectWithGradient)
1027 , m_gradient(gradient)
1031 virtual void apply(GraphicsContext&) const override;
1032 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1035 mutable Ref<Gradient> m_gradient; // FIXME: Make this not mutable
1038 class FillCompositedRect : public DrawingItem {
1040 static Ref<FillCompositedRect> create(const FloatRect& rect, const Color& color, CompositeOperator op, BlendMode blendMode)
1042 return adoptRef(*new FillCompositedRect(rect, color, op, blendMode));
1045 FloatRect rect() const { return m_rect; }
1046 Color color() const { return m_color; }
1047 CompositeOperator compositeOperator() const { return m_op; }
1048 BlendMode blendMode() const { return m_blendMode; }
1051 FillCompositedRect(const FloatRect& rect, const Color& color, CompositeOperator op, BlendMode blendMode)
1052 : DrawingItem(ItemType::FillCompositedRect)
1056 , m_blendMode(blendMode)
1060 virtual void apply(GraphicsContext&) const override;
1061 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1065 CompositeOperator m_op;
1066 BlendMode m_blendMode;
1069 class FillRoundedRect : public DrawingItem {
1071 static Ref<FillRoundedRect> create(const FloatRoundedRect& rect, const Color& color, BlendMode blendMode)
1073 return adoptRef(*new FillRoundedRect(rect, color, blendMode));
1076 const FloatRoundedRect& roundedRect() const { return m_rect; }
1077 Color color() const { return m_color; }
1078 BlendMode blendMode() const { return m_blendMode; }
1081 FillRoundedRect(const FloatRoundedRect& rect, const Color& color, BlendMode blendMode)
1082 : DrawingItem(ItemType::FillRoundedRect)
1085 , m_blendMode(blendMode)
1089 virtual void apply(GraphicsContext&) const override;
1090 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect.rect(); }
1092 FloatRoundedRect m_rect;
1094 BlendMode m_blendMode;
1097 class FillRectWithRoundedHole : public DrawingItem {
1099 static Ref<FillRectWithRoundedHole> create(const FloatRect& rect, const FloatRoundedRect& roundedHoleRect, const Color& color)
1101 return adoptRef(*new FillRectWithRoundedHole(rect, roundedHoleRect, color));
1104 const FloatRect& rect() const { return m_rect; }
1105 const FloatRoundedRect& roundedHoleRect() const { return m_roundedHoleRect; }
1106 Color color() const { return m_color; }
1109 FillRectWithRoundedHole(const FloatRect& rect, const FloatRoundedRect& roundedHoleRect, const Color& color)
1110 : DrawingItem(ItemType::FillRectWithRoundedHole)
1112 , m_roundedHoleRect(roundedHoleRect)
1117 virtual void apply(GraphicsContext&) const override;
1118 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1121 FloatRoundedRect m_roundedHoleRect;
1125 class FillPath : public DrawingItem {
1127 static Ref<FillPath> create(const Path& path)
1129 return adoptRef(*new FillPath(path));
1132 const Path& path() const { return m_path; }
1135 FillPath(const Path& path)
1136 : DrawingItem(ItemType::FillPath)
1141 virtual void apply(GraphicsContext&) const override;
1142 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_path.fastBoundingRect(); }
1147 class FillEllipse : public DrawingItem {
1149 static Ref<FillEllipse> create(const FloatRect& rect)
1151 return adoptRef(*new FillEllipse(rect));
1154 FloatRect rect() const { return m_rect; }
1157 FillEllipse(const FloatRect& rect)
1158 : DrawingItem(ItemType::FillEllipse)
1163 virtual void apply(GraphicsContext&) const override;
1165 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1170 class StrokeRect : public DrawingItem {
1172 static Ref<StrokeRect> create(const FloatRect& rect, float lineWidth)
1174 return adoptRef(*new StrokeRect(rect, lineWidth));
1177 FloatRect rect() const { return m_rect; }
1178 float lineWidth() const { return m_lineWidth; }
1181 StrokeRect(const FloatRect& rect, float lineWidth)
1182 : DrawingItem(ItemType::StrokeRect)
1184 , m_lineWidth(lineWidth)
1188 virtual void apply(GraphicsContext&) const override;
1189 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
1195 class StrokePath : public DrawingItem {
1197 static Ref<StrokePath> create(const Path& path)
1199 return adoptRef(*new StrokePath(path));
1202 const Path& path() const { return m_path; }
1205 StrokePath(const Path& path)
1206 : DrawingItem(ItemType::StrokePath)
1211 virtual void apply(GraphicsContext&) const override;
1212 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
1215 FloatPoint m_blockLocation;
1218 class StrokeEllipse : public DrawingItem {
1220 static Ref<StrokeEllipse> create(const FloatRect& rect)
1222 return adoptRef(*new StrokeEllipse(rect));
1225 FloatRect rect() const { return m_rect; }
1228 StrokeEllipse(const FloatRect& rect)
1229 : DrawingItem(ItemType::StrokeEllipse)
1234 virtual void apply(GraphicsContext&) const override;
1235 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override;
1240 class ClearRect : public DrawingItem {
1242 static Ref<ClearRect> create(const FloatRect& rect)
1244 return adoptRef(*new ClearRect(rect));
1247 FloatRect rect() const { return m_rect; }
1250 ClearRect(const FloatRect& rect)
1251 : DrawingItem(ItemType::ClearRect)
1256 virtual void apply(GraphicsContext&) const override;
1257 virtual Optional<FloatRect> localBounds(const GraphicsContext&) const override { return m_rect; }
1263 class ApplyStrokePattern : public Item {
1265 static Ref<ApplyStrokePattern> create()
1267 return adoptRef(*new ApplyStrokePattern);
1271 ApplyStrokePattern()
1272 : Item(ItemType::ApplyStrokePattern)
1276 virtual void apply(GraphicsContext&) const override;
1279 class ApplyFillPattern : public Item {
1281 static Ref<ApplyFillPattern> create()
1283 return adoptRef(*new ApplyFillPattern);
1288 : Item(ItemType::ApplyFillPattern)
1292 virtual void apply(GraphicsContext&) const override;
1296 class ApplyDeviceScaleFactor : public Item {
1298 static Ref<ApplyDeviceScaleFactor> create(float scaleFactor)
1300 return adoptRef(*new ApplyDeviceScaleFactor(scaleFactor));
1303 float scaleFactor() const { return m_scaleFactor; }
1306 ApplyDeviceScaleFactor(float scaleFactor)
1307 : Item(ItemType::ApplyDeviceScaleFactor)
1308 , m_scaleFactor(scaleFactor)
1312 virtual void apply(GraphicsContext&) const override;
1314 float m_scaleFactor;
1317 TextStream& operator<<(TextStream&, const Item&);
1319 } // namespace DisplayList
1320 } // namespace WebCore
1323 #define SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_DRAWINGITEM(ToValueTypeName, predicate) \
1324 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::DisplayList::ToValueTypeName) \
1325 static bool isType(const WebCore::DisplayList::Item& object) { return object.predicate; } \
1326 SPECIALIZE_TYPE_TRAITS_END()
1328 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_DRAWINGITEM(DrawingItem, isDrawingItem())
1330 #define SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ToValueTypeName) \
1331 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::DisplayList::ToValueTypeName) \
1332 static bool isType(const WebCore::DisplayList::Item& item) { return item.type() == WebCore::DisplayList::ItemType::ToValueTypeName; } \
1333 SPECIALIZE_TYPE_TRAITS_END()
1335 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Save)
1336 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Restore)
1337 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Translate)
1338 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Rotate)
1339 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Scale)
1340 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ConcatenateCTM)
1341 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(SetState)
1342 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(SetLineCap)
1343 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(SetLineDash)
1344 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(SetLineJoin)
1345 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(SetMiterLimit)
1346 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(Clip)
1347 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ClipOut)
1348 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ClipOutToPath)
1349 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ClipPath)
1350 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawGlyphs)
1351 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawImage)
1352 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawTiledImage)
1353 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawTiledScaledImage)
1354 #if USE(CG) || USE(CAIRO)
1355 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawNativeImage)
1357 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawPattern)
1358 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawRect)
1359 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawLine)
1360 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawLinesForText)
1361 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawLineForDocumentMarker)
1362 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawEllipse)
1363 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawPath)
1364 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawFocusRingPath)
1365 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(DrawFocusRingRects)
1366 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillRect)
1367 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillRectWithColor)
1368 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillRectWithGradient)
1369 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillCompositedRect)
1370 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillRoundedRect)
1371 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillRectWithRoundedHole)
1372 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillPath)
1373 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(FillEllipse)
1374 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(StrokeRect)
1375 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(StrokePath)
1376 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(StrokeEllipse)
1377 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ClearRect)
1378 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(BeginTransparencyLayer)
1379 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(EndTransparencyLayer)
1381 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ApplyStrokePattern)
1382 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ApplyFillPattern)
1384 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ApplyDeviceScaleFactor)
1385 SPECIALIZE_TYPE_TRAITS_DISPLAYLIST_ITEM(ClearShadow)
1387 #endif // DisplayListItems_h