[Win] Fix AppleWin build.
[WebKit-https.git] / Source / WebCore / rendering / RenderImage.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2006 Allan Sandfeld Jensen (kde@carewolf.com) 
5  *           (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6  * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #pragma once
26
27 #include "RenderImageResource.h"
28 #include "RenderReplaced.h"
29
30 namespace WebCore {
31
32 class HTMLAreaElement;
33 class HTMLMapElement;
34
35 enum ImageSizeChangeType {
36     ImageSizeChangeNone,
37     ImageSizeChangeForAltText
38 };
39
40 class RenderImage : public RenderReplaced {
41     WTF_MAKE_ISO_ALLOCATED(RenderImage);
42 public:
43     RenderImage(Element&, RenderStyle&&, StyleImage* = nullptr, const float = 1.0f);
44     RenderImage(Document&, RenderStyle&&, StyleImage* = nullptr);
45     virtual ~RenderImage();
46
47     RenderImageResource& imageResource() { return *m_imageResource; }
48     const RenderImageResource& imageResource() const { return *m_imageResource; }
49     CachedImage* cachedImage() const { return imageResource().cachedImage(); }
50
51     ImageSizeChangeType setImageSizeForAltText(CachedImage* newImage = nullptr);
52
53     void updateAltText();
54
55     HTMLMapElement* imageMap() const;
56     void areaElementFocusChanged(HTMLAreaElement*);
57     
58 #if PLATFORM(IOS_FAMILY)
59     void collectSelectionRects(Vector<SelectionRect>&, unsigned, unsigned) override;
60 #endif
61
62     void setIsGeneratedContent(bool generated = true) { m_isGeneratedContent = generated; }
63
64     bool isGeneratedContent() const { return m_isGeneratedContent; }
65
66     const String& altText() const { return m_altText; }
67     void setAltText(const String& altText) { m_altText = altText; }
68
69     void setImageDevicePixelRatio(float factor);
70     float imageDevicePixelRatio() const { return m_imageDevicePixelRatio; }
71
72     void setHasShadowControls(bool hasShadowControls) { m_hasShadowControls = hasShadowControls; }
73     
74     bool isShowingMissingOrImageError() const;
75     bool isShowingAltText() const;
76
77     virtual bool shouldDisplayBrokenImageIcon() const;
78
79     bool hasNonBitmapImage() const;
80
81     bool isEditableImage() const;
82
83 protected:
84     void willBeDestroyed() override;
85
86     bool needsPreferredWidthsRecalculation() const final;
87     RenderBox* embeddedContentBox() const final;
88     void computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const final;
89     bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect, unsigned maxDepthToTest) const override;
90
91     void styleWillChange(StyleDifference, const RenderStyle& newStyle) override;
92     void styleDidChange(StyleDifference, const RenderStyle*) override;
93
94     void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override;
95
96     ImageDrawResult paintIntoRect(PaintInfo&, const FloatRect&);
97     void paint(PaintInfo&, const LayoutPoint&) final;
98     void layout() override;
99
100     void intrinsicSizeChanged() override
101     {
102         imageChanged(imageResource().imagePtr());
103     }
104
105     void incrementVisuallyNonEmptyPixelCountIfNeeded(const IntSize&);
106
107 private:
108     const char* renderName() const override { return "RenderImage"; }
109
110     bool canHaveChildren() const override;
111
112     bool isImage() const override { return true; }
113     bool isRenderImage() const final { return true; }
114     
115     bool requiresLayer() const override;
116
117     void paintReplaced(PaintInfo&, const LayoutPoint&) override;
118     void paintIncompleteImageOutline(PaintInfo&, LayoutPoint, LayoutUnit) const;
119
120     bool computeBackgroundIsKnownToBeObscured(const LayoutPoint& paintOffset) final;
121
122     LayoutUnit minimumReplacedHeight() const override;
123
124     void notifyFinished(CachedResource&) final;
125     bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) final;
126
127     bool boxShadowShouldBeAppliedToBackground(const LayoutPoint& paintOffset, BackgroundBleedAvoidance, InlineFlowBox*) const final;
128
129     virtual bool shadowControlsNeedCustomLayoutMetrics() const { return false; }
130
131     IntSize imageSizeForError(CachedImage*) const;
132     void repaintOrMarkForLayout(ImageSizeChangeType, const IntRect* = nullptr);
133     void updateIntrinsicSizeIfNeeded(const LayoutSize&);
134     // Update the size of the image to be rendered. Object-fit may cause this to be different from the CSS box's content rect.
135     void updateInnerContentRect();
136
137     void paintAreaElementFocusRing(PaintInfo&, const LayoutPoint& paintOffset);
138     
139     void layoutShadowControls(const LayoutSize& oldSize);
140
141     LayoutUnit computeReplacedLogicalWidth(ShouldComputePreferred = ComputeActual) const override;
142     LayoutUnit computeReplacedLogicalHeight(Optional<LayoutUnit> estimatedUsedWidth = WTF::nullopt) const override;
143
144     bool shouldCollapseToEmpty() const;
145
146     // Text to display as long as the image isn't available.
147     String m_altText;
148     std::unique_ptr<RenderImageResource> m_imageResource;
149     bool m_needsToSetSizeForAltText { false };
150     bool m_didIncrementVisuallyNonEmptyPixelCount { false };
151     bool m_isGeneratedContent { false };
152     bool m_hasShadowControls { false };
153     float m_imageDevicePixelRatio { 1 };
154
155     friend class RenderImageScaleObserver;
156 };
157
158 } // namespace WebCore
159
160 SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderImage, isRenderImage())