Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(535)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h

Issue 2107103002: Find cached display items directly during painting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef DisplayItem_h 5 #ifndef DisplayItem_h
6 #define DisplayItem_h 6 #define DisplayItem_h
7 7
8 #include "platform/PlatformExport.h" 8 #include "platform/PlatformExport.h"
9 #include "platform/graphics/ContiguousContainer.h" 9 #include "platform/graphics/ContiguousContainer.h"
10 #include "platform/graphics/paint/DisplayItemClient.h" 10 #include "platform/graphics/paint/DisplayItemClient.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 TableSectionBoxShadowInset, 109 TableSectionBoxShadowInset,
110 TableSectionBoxShadowNormal, 110 TableSectionBoxShadowNormal,
111 TableRowBoxShadowInset, 111 TableRowBoxShadowInset,
112 TableRowBoxShadowNormal, 112 TableRowBoxShadowNormal,
113 VideoBitmap, 113 VideoBitmap,
114 WebPlugin, 114 WebPlugin,
115 WebFont, 115 WebFont,
116 ReflectionMask, 116 ReflectionMask,
117 DrawingLast = ReflectionMask, 117 DrawingLast = ReflectionMask,
118 118
119 CachedDrawingFirst,
120 CachedDrawingLast = CachedDrawingFirst + DrawingLast - DrawingFirst,
121
122 ForeignLayerFirst, 119 ForeignLayerFirst,
123 ForeignLayerCanvas = ForeignLayerFirst, 120 ForeignLayerCanvas = ForeignLayerFirst,
124 ForeignLayerPlugin, 121 ForeignLayerPlugin,
125 ForeignLayerVideo, 122 ForeignLayerVideo,
126 ForeignLayerLast = ForeignLayerVideo, 123 ForeignLayerLast = ForeignLayerVideo,
127 124
128 ClipFirst, 125 ClipFirst,
129 ClipBoxPaintPhaseFirst = ClipFirst, 126 ClipBoxPaintPhaseFirst = ClipFirst,
130 ClipBoxPaintPhaseLast = ClipBoxPaintPhaseFirst + PaintPhaseMax, 127 ClipBoxPaintPhaseLast = ClipBoxPaintPhaseFirst + PaintPhaseMax,
131 ClipColumnBoundsPaintPhaseFirst, 128 ClipColumnBoundsPaintPhaseFirst,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 EndFilter, 174 EndFilter,
178 BeginCompositing, 175 BeginCompositing,
179 EndCompositing, 176 EndCompositing,
180 BeginTransform, 177 BeginTransform,
181 EndTransform, 178 EndTransform,
182 BeginClipPath, 179 BeginClipPath,
183 EndClipPath, 180 EndClipPath,
184 181
185 Subsequence, 182 Subsequence,
186 EndSubsequence, 183 EndSubsequence,
187 CachedSubsequence,
188 184
189 UninitializedType, 185 UninitializedType,
190 TypeLast = UninitializedType 186 TypeLast = UninitializedType
191 }; 187 };
192 188
193 static_assert(TableCollapsedBorderBase >= TableCollapsedBorderUnalignedBase, "TableCollapsedBorder types overlap with other types"); 189 static_assert(TableCollapsedBorderBase >= TableCollapsedBorderUnalignedBase, "TableCollapsedBorder types overlap with other types");
194 static_assert((TableCollapsedBorderBase & 0xf) == 0, "The lowest 4 bits of T ableCollapsedBorderBase should be zero"); 190 static_assert((TableCollapsedBorderBase & 0xf) == 0, "The lowest 4 bits of T ableCollapsedBorderBase should be zero");
195 // Bits or'ed onto TableCollapsedBorderBase to generate a real table collaps ed border type. 191 // Bits or'ed onto TableCollapsedBorderBase to generate a real table collaps ed border type.
196 enum TableCollapsedBorderSides { 192 enum TableCollapsedBorderSides {
197 TableCollapsedBorderTop = 1 << 0, 193 TableCollapsedBorderTop = 1 << 0,
(...skipping 19 matching lines...) Expand all
217 213
218 virtual ~DisplayItem() { } 214 virtual ~DisplayItem() { }
219 215
220 // Ids are for matching new DisplayItems with existing DisplayItems. 216 // Ids are for matching new DisplayItems with existing DisplayItems.
221 struct Id { 217 struct Id {
222 STACK_ALLOCATED(); 218 STACK_ALLOCATED();
223 Id(const DisplayItemClient& client, const Type type) 219 Id(const DisplayItemClient& client, const Type type)
224 : client(client) 220 : client(client)
225 , type(type) { } 221 , type(type) { }
226 222
227 bool matches(const DisplayItem& item) const
228 {
229 // We should always convert to non-cached types before matching.
230 ASSERT(!isCachedType(item.m_type));
231 ASSERT(!isCachedType(type));
232 return &client == item.m_client && type == item.m_type;
233 }
234
235 const DisplayItemClient& client; 223 const DisplayItemClient& client;
236 const Type type; 224 const Type type;
237 }; 225 };
238 226
239 // Convert cached type to non-cached type (e.g., Type::CachedSVGImage -> Typ e::SVGImage). 227 Id getId() const { return Id(*m_client, m_type); }
240 static Type nonCachedType(Type type)
241 {
242 if (isCachedDrawingType(type))
243 return cachedDrawingTypeToDrawingType(type);
244 if (type == CachedSubsequence)
245 return Subsequence;
246 return type;
247 }
248
249 // Return the Id with cached type converted to non-cached type.
250 Id nonCachedId() const
251 {
252 return Id(*m_client, nonCachedType(m_type));
253 }
254 228
255 virtual void replay(GraphicsContext&) const { } 229 virtual void replay(GraphicsContext&) const { }
256 230
257 const DisplayItemClient& client() const { ASSERT(m_client); return *m_client ; } 231 const DisplayItemClient& client() const { ASSERT(m_client); return *m_client ; }
258 Type getType() const { return m_type; } 232 Type getType() const { return m_type; }
259 233
260 // Size of this object in memory, used to move it with memcpy. 234 // Size of this object in memory, used to move it with memcpy.
261 // This is not sizeof(*this), because it needs to account for the size of 235 // This is not sizeof(*this), because it needs to account for the size of
262 // the derived class (i.e. runtime type). Derived classes are expected to 236 // the derived class (i.e. runtime type). Derived classes are expected to
263 // supply this to the DisplayItem constructor. 237 // supply this to the DisplayItem constructor.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 #define DEFINE_PAINT_PHASE_CONVERSION_METHOD(Category) \ 270 #define DEFINE_PAINT_PHASE_CONVERSION_METHOD(Category) \
297 static Type paintPhaseTo##Category##Type(int paintPhase) \ 271 static Type paintPhaseTo##Category##Type(int paintPhase) \
298 { \ 272 { \
299 static_assert(Category##PaintPhaseLast - Category##PaintPhaseFirst == Pa intPhaseMax, \ 273 static_assert(Category##PaintPhaseLast - Category##PaintPhaseFirst == Pa intPhaseMax, \
300 "Invalid paint-phase-based category " #Category ". See comments of D isplayItem::Type"); \ 274 "Invalid paint-phase-based category " #Category ". See comments of D isplayItem::Type"); \
301 return static_cast<Type>(paintPhase + Category##PaintPhaseFirst); \ 275 return static_cast<Type>(paintPhase + Category##PaintPhaseFirst); \
302 } 276 }
303 277
304 DEFINE_CATEGORY_METHODS(Drawing) 278 DEFINE_CATEGORY_METHODS(Drawing)
305 DEFINE_PAINT_PHASE_CONVERSION_METHOD(Drawing) 279 DEFINE_PAINT_PHASE_CONVERSION_METHOD(Drawing)
306 DEFINE_CATEGORY_METHODS(CachedDrawing)
307 DEFINE_CONVERSION_METHODS(Drawing, drawing, CachedDrawing, cachedDrawing)
308 280
309 DEFINE_CATEGORY_METHODS(ForeignLayer) 281 DEFINE_CATEGORY_METHODS(ForeignLayer)
310 282
311 DEFINE_PAIRED_CATEGORY_METHODS(Clip, clip) 283 DEFINE_PAIRED_CATEGORY_METHODS(Clip, clip)
312 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipLayerFragment) 284 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipLayerFragment)
313 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipBox) 285 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipBox)
314 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipColumnBounds) 286 DEFINE_PAINT_PHASE_CONVERSION_METHOD(ClipColumnBounds)
315 287
316 DEFINE_PAIRED_CATEGORY_METHODS(FloatClip, floatClip) 288 DEFINE_PAIRED_CATEGORY_METHODS(FloatClip, floatClip)
317 DEFINE_PAINT_PHASE_CONVERSION_METHOD(FloatClip) 289 DEFINE_PAINT_PHASE_CONVERSION_METHOD(FloatClip)
318 290
319 DEFINE_PAIRED_CATEGORY_METHODS(Scroll, scroll) 291 DEFINE_PAIRED_CATEGORY_METHODS(Scroll, scroll)
320 DEFINE_PAINT_PHASE_CONVERSION_METHOD(Scroll) 292 DEFINE_PAINT_PHASE_CONVERSION_METHOD(Scroll)
321 293
322 DEFINE_PAIRED_CATEGORY_METHODS(Transform3D, transform3D) 294 DEFINE_PAIRED_CATEGORY_METHODS(Transform3D, transform3D)
323 295
324 static bool isCachedType(Type type) { return isCachedDrawingType(type) || ty pe == CachedSubsequence; }
325 bool isCached() const { return isCachedType(m_type); }
326 static bool isCacheableType(Type type) { return isDrawingType(type) || type == Subsequence; } 296 static bool isCacheableType(Type type) { return isDrawingType(type) || type == Subsequence; }
327 bool isCacheable() const { return !skippedCache() && isCacheableType(m_type) ; } 297 bool isCacheable() const { return !skippedCache() && isCacheableType(m_type) ; }
328 298
329 virtual bool isBegin() const { return false; } 299 virtual bool isBegin() const { return false; }
330 virtual bool isEnd() const { return false; } 300 virtual bool isEnd() const { return false; }
331 301
332 #if DCHECK_IS_ON() 302 #if DCHECK_IS_ON()
333 virtual bool isEndAndPairedWith(DisplayItem::Type otherType) const { return false; } 303 virtual bool isEndAndPairedWith(DisplayItem::Type otherType) const { return false; }
334 virtual bool equals(const DisplayItem& other) const 304 virtual bool equals(const DisplayItem& other) const
335 { 305 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 static_assert(TypeLast < (1 << 16), "DisplayItem::Type should fit in 16 bits "); 346 static_assert(TypeLast < (1 << 16), "DisplayItem::Type should fit in 16 bits ");
377 const Type m_type : 16; 347 const Type m_type : 16;
378 const unsigned m_derivedSize : 8; // size of the actual derived class 348 const unsigned m_derivedSize : 8; // size of the actual derived class
379 unsigned m_skippedCache : 1; 349 unsigned m_skippedCache : 1;
380 350
381 #ifndef NDEBUG 351 #ifndef NDEBUG
382 WTF::String m_clientDebugString; 352 WTF::String m_clientDebugString;
383 #endif 353 #endif
384 }; 354 };
385 355
356 inline bool operator==(const DisplayItem::Id& a, const DisplayItem::Id& b)
357 {
358 return a.client == b.client && a.type == b.type;
359 }
360
361 inline bool operator!=(const DisplayItem::Id& a, const DisplayItem::Id& b)
362 {
363 return !(a == b);
364 }
365
386 class PLATFORM_EXPORT PairedBeginDisplayItem : public DisplayItem { 366 class PLATFORM_EXPORT PairedBeginDisplayItem : public DisplayItem {
387 protected: 367 protected:
388 PairedBeginDisplayItem(const DisplayItemClient& client, Type type, size_t de rivedSize) : DisplayItem(client, type, derivedSize) { } 368 PairedBeginDisplayItem(const DisplayItemClient& client, Type type, size_t de rivedSize) : DisplayItem(client, type, derivedSize) { }
389 369
390 private: 370 private:
391 bool isBegin() const final { return true; } 371 bool isBegin() const final { return true; }
392 }; 372 };
393 373
394 class PLATFORM_EXPORT PairedEndDisplayItem : public DisplayItem { 374 class PLATFORM_EXPORT PairedEndDisplayItem : public DisplayItem {
395 protected: 375 protected:
396 PairedEndDisplayItem(const DisplayItemClient& client, Type type, size_t deri vedSize) : DisplayItem(client, type, derivedSize) { } 376 PairedEndDisplayItem(const DisplayItemClient& client, Type type, size_t deri vedSize) : DisplayItem(client, type, derivedSize) { }
397 377
398 #if ENABLE(ASSERT) 378 #if ENABLE(ASSERT)
399 bool isEndAndPairedWith(DisplayItem::Type otherType) const override = 0; 379 bool isEndAndPairedWith(DisplayItem::Type otherType) const override = 0;
400 #endif 380 #endif
401 381
402 private: 382 private:
403 bool isEnd() const final { return true; } 383 bool isEnd() const final { return true; }
404 }; 384 };
405 385
406 } // namespace blink 386 } // namespace blink
407 387
408 #endif // DisplayItem_h 388 #endif // DisplayItem_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698