3aa540034b5a8cf6ccea44095fffda659c7b6fd6
[WebKit-https.git] / Source / WebCore / platform / graphics / displaylists / DisplayList.cpp
1 /*
2  * Copyright (C) 2016 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 #include "config.h"
27 #include "DisplayList.h"
28
29 #include "DisplayListItems.h"
30 #include "Logging.h"
31 #include "TextStream.h"
32 #include <wtf/StdLibExtras.h>
33
34 namespace WebCore {
35 namespace DisplayList {
36
37 #if !defined(NDEBUG) || !LOG_DISABLED
38 WTF::CString DisplayList::description() const
39 {
40     TextStream ts;
41     ts << *this;
42     return ts.release().utf8();
43 }
44
45 void DisplayList::dump() const
46 {
47     fprintf(stderr, "%s", description().data());
48 }
49 #endif
50
51 void DisplayList::clear()
52 {
53     m_list.clear();
54 }
55
56 void DisplayList::removeItemsFromIndex(size_t index)
57 {
58     m_list.resize(index);
59 }
60
61 bool DisplayList::shouldDumpForFlags(AsTextFlags flags, const Item& item)
62 {
63     switch (item.type()) {
64     case ItemType::SetState:
65         if (!(flags & AsTextFlag::IncludesPlatformOperations)) {
66             const auto& stateItem = downcast<SetState>(item);
67             // FIXME: for now, only drop the item if the only state-change flags are platform-specific.
68             if (stateItem.state().m_changeFlags == GraphicsContextState::ShouldSubpixelQuantizeFontsChange)
69                 return false;
70
71             if (stateItem.state().m_changeFlags == GraphicsContextState::AntialiasedFontDilationEnabledChange)
72                 return false;
73
74             if (stateItem.state().m_changeFlags == GraphicsContextState::ShouldSubpixelQuantizeFontsChange)
75                 return false;
76         }
77         break;
78 #if USE(CG)
79     case ItemType::ApplyFillPattern:
80     case ItemType::ApplyStrokePattern:
81         if (!(flags & AsTextFlag::IncludesPlatformOperations))
82             return false;
83         break;
84 #endif
85     default:
86         break;
87     }
88     return true;
89 }
90
91 String DisplayList::asText(AsTextFlags flags) const
92 {
93     TextStream stream;
94     size_t numItems = m_list.size();
95     for (size_t i = 0; i < numItems; ++i) {
96         const auto& item = m_list[i].get();
97         if (!shouldDumpForFlags(flags, item))
98             continue;
99
100         TextStream::GroupScope scope(stream);
101         stream << item;
102     }
103     return stream.release();
104 }
105
106 void DisplayList::dump(TextStream& ts) const
107 {
108     TextStream::GroupScope group(ts);
109     ts << "display list";
110
111     size_t numItems = m_list.size();
112     for (size_t i = 0; i < numItems; ++i) {
113         TextStream::GroupScope scope(ts);
114         ts << i << " " << m_list[i].get();
115     }
116     ts.startGroup();
117     ts << "size in bytes: " << sizeInBytes();
118     ts.endGroup();
119 }
120
121 size_t DisplayList::sizeInBytes() const
122 {
123     size_t result = 0;
124     for (auto& ref : m_list)
125         result += Item::sizeInBytes(ref);
126
127     return result;
128 }
129
130 } // namespace DisplayList
131
132 TextStream& operator<<(TextStream& ts, const DisplayList::DisplayList& displayList)
133 {
134     displayList.dump(ts);
135     return ts;
136 }
137
138 } // namespace WebCore