Subpixel rendering[iOS]: <select> decoration is misaligned when the renderer is on...
[WebKit-https.git] / Source / WebCore / platform / efl / RenderThemeEfl.h
1 /*
2  * This file is part of the WebKit project.
3  *
4  * Copyright (C) 2006 Apple Inc.
5  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
6  * Copyright (C) 2007 Holger Hans Peter Freyther
7  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
8  * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia
9  * Copyright (C) 2009-2010 ProFUSION embedded systems
10  * Copyright (C) 2009-2010 Samsung Electronics
11  * All rights reserved.
12  *
13  * This library is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Library General Public
15  * License as published by the Free Software Foundation; either
16  * version 2 of the License, or (at your option) any later version.
17  *
18  * This library is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Library General Public License for more details.
22  *
23  * You should have received a copy of the GNU Library General Public License
24  * along with this library; see the file COPYING.LIB.  If not, write to
25  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26  * Boston, MA 02110-1301, USA.
27  *
28  */
29
30 #ifndef RenderThemeEfl_h
31 #define RenderThemeEfl_h
32
33 #include "RenderTheme.h"
34
35 #include <Eina.h>
36 #include <cairo.h>
37 #include <wtf/efl/RefPtrEfl.h>
38 #include <wtf/efl/UniquePtrEfl.h>
39
40 namespace WebCore {
41
42 enum FormType { // KEEP IN SYNC WITH edjeGroupFromFormType()
43     Button,
44     RadioButton,
45     TextField,
46     CheckBox,
47     ComboBox,
48 #if ENABLE(PROGRESS_ELEMENT)
49     ProgressBar,
50 #endif
51     SearchField,
52     SearchFieldResultsButton,
53     SearchFieldResultsDecoration,
54     SearchFieldCancelButton,
55     SliderVertical,
56     SliderHorizontal,
57     SliderThumbVertical,
58     SliderThumbHorizontal,
59     Spinner,
60     FormTypeLast
61 };
62
63 class RenderThemeEfl : public RenderTheme {
64 private:
65     explicit RenderThemeEfl(Page*);
66     ~RenderThemeEfl();
67
68 public:
69     static PassRefPtr<RenderTheme> create(Page*);
70
71     // A method asking if the theme's controls actually care about redrawing when hovered.
72     virtual bool supportsHover(const RenderStyle*) const { return true; }
73
74     // A method Returning whether the control is styled by css or not e.g specifying background-color.
75     virtual bool isControlStyled(const RenderStyle*, const BorderData&, const FillLayer&, const Color& backgroundColor) const;
76
77     // A method asking if the theme is able to draw the focus ring.
78     virtual bool supportsFocusRing(const RenderStyle*) const;
79
80     // A method asking if the control changes its tint when the window has focus or not.
81     virtual bool controlSupportsTints(const RenderObject&) const;
82
83     // A general method asking if any control tinting is supported at all.
84     virtual bool supportsControlTints() const { return true; }
85
86     // A general method asking if foreground colors of selection are supported.
87     virtual bool supportsSelectionForegroundColors() const;
88
89     // A method to obtain the baseline position for a "leaf" control. This will only be used if a baseline
90     // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
91     // controls that need to do this.
92     virtual int baselinePosition(const RenderObject&) const;
93
94     virtual Color platformActiveSelectionBackgroundColor() const;
95     virtual Color platformInactiveSelectionBackgroundColor() const;
96     virtual Color platformActiveSelectionForegroundColor() const;
97     virtual Color platformInactiveSelectionForegroundColor() const;
98     virtual Color platformFocusRingColor() const;
99
100     // Set platform colors; remember to call platformColorDidChange after.
101     void setColorFromThemeClass(const char* colorClass);
102
103     void setButtonTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
104     void setComboTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
105     void setEntryTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
106     void setSearchTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
107
108     void adjustSizeConstraints(RenderStyle*, FormType) const;
109
110     // System fonts.
111     virtual void systemFont(CSSValueID, FontDescription&) const;
112
113     virtual void adjustCheckboxStyle(StyleResolver*, RenderStyle*, Element*) const;
114     virtual bool paintCheckbox(const RenderObject&, const PaintInfo&, const IntRect&);
115
116     virtual void adjustRadioStyle(StyleResolver*, RenderStyle*, Element*) const;
117     virtual bool paintRadio(const RenderObject&, const PaintInfo&, const IntRect&);
118
119     virtual void adjustButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
120     virtual bool paintButton(const RenderObject&, const PaintInfo&, const IntRect&);
121
122     virtual void adjustTextFieldStyle(StyleResolver*, RenderStyle*, Element*) const;
123     virtual bool paintTextField(const RenderObject&, const PaintInfo&, const IntRect&);
124
125     virtual void adjustTextAreaStyle(StyleResolver*, RenderStyle*, Element*) const;
126     virtual bool paintTextArea(const RenderObject&, const PaintInfo&, const IntRect&);
127
128     virtual void adjustMenuListStyle(StyleResolver*, RenderStyle*, Element*) const;
129     virtual bool paintMenuList(const RenderObject&, const PaintInfo&, const IntRect&);
130
131     virtual void adjustMenuListButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
132     virtual bool paintMenuListButtonDecorations(const RenderObject&, const PaintInfo&, const FloatRect&);
133
134     virtual void adjustSearchFieldResultsDecorationPartStyle(StyleResolver*, RenderStyle*, Element*) const;
135     virtual bool paintSearchFieldResultsDecorationPart(const RenderObject&, const PaintInfo&, const IntRect&);
136
137     virtual void adjustSearchFieldStyle(StyleResolver*, RenderStyle*, Element*) const;
138     virtual bool paintSearchField(const RenderObject&, const PaintInfo&, const IntRect&);
139
140     virtual void adjustSearchFieldResultsButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
141     virtual bool paintSearchFieldResultsButton(const RenderObject&, const PaintInfo&, const IntRect&);
142
143     virtual void adjustSearchFieldCancelButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
144     virtual bool paintSearchFieldCancelButton(const RenderObject&, const PaintInfo&, const IntRect&);
145
146     virtual void adjustSliderTrackStyle(StyleResolver*, RenderStyle*, Element*) const;
147     virtual bool paintSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&);
148
149     virtual void adjustSliderThumbStyle(StyleResolver*, RenderStyle*, Element*) const;
150
151     virtual void adjustSliderThumbSize(RenderStyle*, Element*) const;
152
153 #if ENABLE(DATALIST_ELEMENT)
154     virtual IntSize sliderTickSize() const override;
155     virtual int sliderTickOffsetFromTrackCenter() const override;
156     virtual LayoutUnit sliderTickSnappingThreshold() const override;
157 #endif
158
159     virtual bool supportsDataListUI(const AtomicString&) const override;
160
161     virtual bool paintSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&);
162
163     virtual void adjustInnerSpinButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
164     virtual bool paintInnerSpinButton(const RenderObject&, const PaintInfo&, const IntRect&);
165
166     static void setDefaultFontSize(int fontsize);
167
168 #if ENABLE(PROGRESS_ELEMENT)
169     virtual void adjustProgressBarStyle(StyleResolver*, RenderStyle*, Element*) const;
170     virtual bool paintProgressBar(const RenderObject&, const PaintInfo&, const IntRect&);
171     virtual double animationRepeatIntervalForProgressBar(RenderProgress*) const;
172     virtual double animationDurationForProgressBar(RenderProgress*) const;
173 #endif
174
175 #if ENABLE(VIDEO)
176     virtual String mediaControlsStyleSheet();
177     virtual String mediaControlsScript();
178 #endif
179 #if ENABLE(VIDEO_TRACK)
180     virtual bool supportsClosedCaptioning() const override { return true; }
181 #endif
182     virtual bool shouldShowPlaceholderWhenFocused() const override { return true; }
183
184     void setThemePath(const String&);
185     String themePath() const;
186
187 protected:
188     static float defaultFontSize;
189
190 private:
191     bool loadTheme();
192     ALWAYS_INLINE bool loadThemeIfNeeded() const
193     {
194         return m_edje || (!m_themePath.isEmpty() && const_cast<RenderThemeEfl*>(this)->loadTheme());
195     }
196
197     ALWAYS_INLINE Ecore_Evas* canvas() const { return m_canvas.get(); }
198     ALWAYS_INLINE Evas_Object* edje() const { return m_edje.get(); }
199
200     void applyPartDescriptionsFrom(const String& themePath);
201
202     void applyEdjeStateFromForm(Evas_Object*, const ControlStates*, bool);
203     void applyEdjeRTLState(Evas_Object*, const RenderObject&, FormType, const IntRect&);
204     bool paintThemePart(const RenderObject&, FormType, const PaintInfo&, const IntRect&);
205
206     Page* m_page;
207     Color m_activeSelectionBackgroundColor;
208     Color m_activeSelectionForegroundColor;
209     Color m_inactiveSelectionBackgroundColor;
210     Color m_inactiveSelectionForegroundColor;
211     Color m_focusRingColor;
212     Color m_sliderThumbColor;
213
214     String m_themePath;
215     // Order so that the canvas gets destroyed at last.
216     EflUniquePtr<Ecore_Evas> m_canvas;
217     RefPtr<Evas_Object> m_edje;
218
219     bool m_supportsSelectionForegroundColor;
220
221     struct ThemePartDesc {
222         FormType type;
223         LengthSize min;
224         LengthSize max;
225         LengthBox padding;
226     };
227     void applyPartDescriptionFallback(struct ThemePartDesc*);
228     void applyPartDescription(Evas_Object*, struct ThemePartDesc*);
229
230     struct ThemePartCacheEntry {
231         static PassOwnPtr<RenderThemeEfl::ThemePartCacheEntry> create(const String& themePath, FormType, const IntSize&);
232         void reuse(const String& themePath, FormType, const IntSize&);
233
234         ALWAYS_INLINE Ecore_Evas* canvas() { return m_canvas.get(); }
235         ALWAYS_INLINE Evas_Object* edje() { return m_edje.get(); }
236         ALWAYS_INLINE cairo_surface_t* surface() { return m_surface.get(); }
237
238         FormType type;
239         IntSize size;
240
241     private:
242         // Order so that the canvas gets destroyed at last.
243         EflUniquePtr<Ecore_Evas> m_canvas;
244         RefPtr<Evas_Object> m_edje;
245         RefPtr<cairo_surface_t> m_surface;
246     };
247
248     struct ThemePartDesc m_partDescs[FormTypeLast];
249
250     // List of ThemePartCacheEntry* sorted so that the most recently
251     // used entries come first. We use a list for efficient moving
252     // of items within the container.
253     Eina_List* m_partCache;
254
255     ThemePartCacheEntry* getThemePartFromCache(FormType, const IntSize&);
256     void clearThemePartCache();
257 };
258 }
259
260 #endif // RenderThemeEfl_h