Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / graphics / InbandTextTrackPrivateClient.h
1 /*
2  * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25
26 #pragma once
27
28 #if ENABLE(VIDEO_TRACK)
29
30 #include "Color.h"
31 #include "TrackPrivateBase.h"
32 #include <wtf/MediaTime.h>
33
34 #if ENABLE(DATACUE_VALUE)
35 #include "SerializedPlatformRepresentation.h"
36 #endif
37
38 namespace WebCore {
39
40 class InbandTextTrackPrivate;
41 class ISOWebVTTCue;
42
43 class GenericCueData : public RefCounted<GenericCueData> {
44 public:
45     static Ref<GenericCueData> create() { return adoptRef(*new GenericCueData); }
46
47     MediaTime startTime() const { return m_startTime; }
48     void setStartTime(const MediaTime& startTime) { m_startTime = startTime; }
49
50     MediaTime endTime() const { return m_endTime; }
51     void setEndTime(const MediaTime& endTime) { m_endTime = endTime; }
52
53     const String& id() const { return m_id; }
54     void setId(const String& id) { m_id = id; }
55
56     const String& content() const { return m_content; }
57     void setContent(const String& content) { m_content = content; }
58
59     double line() const { return m_line; }
60     void setLine(double line) { m_line = line; }
61
62     double position() const { return m_position; }
63     void setPosition(double position) { m_position = position; }
64
65     double size() const { return m_size; }
66     void setSize(double size) { m_size = size; }
67
68     enum Alignment { None, Start, Middle, End };
69     Alignment align() const { return m_align; }
70     void setAlign(Alignment align) { m_align = align; }
71
72     const String& fontName() const { return m_fontName; }
73     void setFontName(const String& fontName) { m_fontName = fontName; }
74
75     double baseFontSize() const { return m_baseFontSize; }
76     void setBaseFontSize(double baseFontSize) { m_baseFontSize = baseFontSize; }
77
78     double relativeFontSize() const { return m_relativeFontSize; }
79     void setRelativeFontSize(double relativeFontSize) { m_relativeFontSize = relativeFontSize; }
80
81     const Color& foregroundColor() const { return m_foregroundColor; }
82     void setForegroundColor(const Color& color) { m_foregroundColor = color; }
83
84     const Color& backgroundColor() const { return m_backgroundColor; }
85     void setBackgroundColor(const Color& color) { m_backgroundColor = color; }
86
87     const Color& highlightColor() const { return m_highlightColor; }
88     void setHighlightColor(const Color& color) { m_highlightColor = color; }
89
90     enum Status { Uninitialized, Partial, Complete };
91     Status status() { return m_status; }
92     void setStatus(Status status) { m_status = status; }
93
94     bool doesExtendCueData(const GenericCueData&) const;
95
96     String toString() const;
97
98 private:
99     GenericCueData() = default;
100
101     MediaTime m_startTime;
102     MediaTime m_endTime;
103     String m_id;
104     String m_content;
105     double m_line { -1 };
106     double m_position { -1 };
107     double m_size { -1 };
108     Alignment m_align { None };
109     String m_fontName;
110     double m_baseFontSize { 0 };
111     double m_relativeFontSize { 0 };
112     Color m_foregroundColor;
113     Color m_backgroundColor;
114     Color m_highlightColor;
115     Status m_status { Uninitialized };
116 };
117
118 inline String GenericCueData::toString() const
119 {
120     StringBuilder builder;
121
122     builder.appendLiteral("start = ");
123     builder.append(m_startTime.toString());
124
125     builder.appendLiteral(", end = ");
126     builder.append(m_endTime.toString());
127
128     const char* status;
129     switch (m_status) {
130     case GenericCueData::Uninitialized:
131         status = "Uninitialized";
132         break;
133     case GenericCueData::Partial:
134         status = "Partial";
135         break;
136     case GenericCueData::Complete:
137         status = "Complete";
138         break;
139     }
140     builder.appendLiteral(", status = ");
141     builder.append(status);
142
143     builder.appendLiteral(", id = ");
144     builder.append(m_id);
145
146     if (m_line > 0) {
147         builder.appendLiteral(", line = ");
148         builder.appendNumber(m_line);
149     }
150
151     if (m_size > 0) {
152         builder.appendLiteral(", size = ");
153         builder.appendNumber(m_size);
154     }
155
156     if (m_position > 0) {
157         builder.appendLiteral(", position = ");
158         builder.appendNumber(m_position);
159     }
160
161     if (m_align != None) {
162         const char* align;
163         switch (m_align) {
164         case GenericCueData::Start:
165             align = "Start";
166             break;
167         case GenericCueData::Middle:
168             align = "Middle";
169             break;
170         case GenericCueData::End:
171             align = "End";
172             break;
173         case GenericCueData::None:
174             align = "None";
175             break;
176         }
177         builder.appendLiteral(", align = ");
178         builder.append(align);
179     }
180
181     if (m_foregroundColor.isValid()) {
182         builder.appendLiteral(", foreground color = ");
183         builder.append(m_foregroundColor.serialized());
184     }
185
186     if (m_backgroundColor.isValid()) {
187         builder.appendLiteral(", background color = ");
188         builder.append(m_backgroundColor.serialized());
189     }
190
191     if (m_highlightColor.isValid()) {
192         builder.appendLiteral(", hilight color = ");
193         builder.append(m_highlightColor.serialized());
194     }
195
196     if (m_baseFontSize) {
197         builder.appendLiteral(", base font size = ");
198         builder.appendNumber(m_baseFontSize);
199     }
200
201     if (m_relativeFontSize) {
202         builder.appendLiteral(", relative font size = ");
203         builder.appendNumber(m_relativeFontSize);
204     }
205
206     if (!m_fontName.isEmpty()) {
207         builder.appendLiteral(", font = ");
208         builder.append(m_fontName);
209     }
210
211     return builder.toString();
212 }
213
214 inline bool GenericCueData::doesExtendCueData(const GenericCueData& other) const
215 {
216     if (m_relativeFontSize != other.m_relativeFontSize)
217         return false;
218     if (m_baseFontSize != other.m_baseFontSize)
219         return false;
220     if (m_position != other.m_position)
221         return false;
222     if (m_line != other.m_line)
223         return false;
224     if (m_size != other.m_size)
225         return false;
226     if (m_align != other.m_align)
227         return false;
228     if (m_foregroundColor != other.m_foregroundColor)
229         return false;
230     if (m_backgroundColor != other.m_backgroundColor)
231         return false;
232     if (m_highlightColor != other.m_highlightColor)
233         return false;
234     if (m_fontName != other.m_fontName)
235         return false;
236     if (m_id != other.m_id)
237         return false;
238     if (m_content != other.m_content)
239         return false;
240     
241     return true;
242 }
243     
244 class InbandTextTrackPrivateClient : public TrackPrivateBaseClient {
245 public:
246     virtual ~InbandTextTrackPrivateClient() = default;
247
248     virtual void addDataCue(const MediaTime& start, const MediaTime& end, const void*, unsigned) = 0;
249
250 #if ENABLE(DATACUE_VALUE)
251     virtual void addDataCue(const MediaTime& start, const MediaTime& end, Ref<SerializedPlatformRepresentation>&&, const String&) = 0;
252     virtual void updateDataCue(const MediaTime& start, const MediaTime& end, SerializedPlatformRepresentation&) = 0;
253     virtual void removeDataCue(const MediaTime& start, const MediaTime& end, SerializedPlatformRepresentation&) = 0;
254 #endif
255
256     virtual void addGenericCue(GenericCueData&) = 0;
257     virtual void updateGenericCue(GenericCueData&) = 0;
258     virtual void removeGenericCue(GenericCueData&) = 0;
259
260     virtual void parseWebVTTFileHeader(String&&) { ASSERT_NOT_REACHED(); }
261     virtual void parseWebVTTCueData(const char* data, unsigned length) = 0;
262     virtual void parseWebVTTCueData(const ISOWebVTTCue&) = 0;
263 };
264
265 } // namespace WebCore
266
267 namespace PAL {
268
269 template<typename Type>
270 struct LogArgument;
271
272 template <>
273 struct LogArgument<WebCore::GenericCueData> {
274     static String toString(const WebCore::GenericCueData& cue)
275     {
276         return cue.toString();
277     }
278 };
279
280 }
281
282 #endif