1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6  */
7 // IWYU pragma: private, include "nsDisplayList.h"
8 
9 /**
10  * It's useful to be able to dynamically check the type of certain items.
11  * Every subclass of nsDisplayItem must have a new type added here for the
12  * purposes of easy comparison and matching of items in different display lists.
13  */
14 
15 #ifndef NSDISPLAYITEMTYPES_H_
16 #define NSDISPLAYITEMTYPES_H_
17 
18 enum class DisplayItemType : uint8_t {
19   TYPE_ZERO = 0, /** Spacer so that the first item starts at 1 */
20 
21 #define DECLARE_DISPLAY_ITEM_TYPE(name, flags) TYPE_##name,
22 #include "nsDisplayItemTypesList.h"
23 #undef DECLARE_DISPLAY_ITEM_TYPE
24 
25   TYPE_MAX
26 };
27 
28 enum {
29   // Number of bits needed to represent all types
30   TYPE_BITS = 8
31 };
32 
33 enum DisplayItemFlags {
34   TYPE_RENDERS_NO_IMAGES = 1 << 0,
35   TYPE_IS_CONTENTFUL = 1 << 1,
36   TYPE_IS_CONTAINER = 1 << 2
37 };
38 
DisplayItemTypeName(DisplayItemType aType)39 inline const char* DisplayItemTypeName(DisplayItemType aType) {
40   switch (aType) {
41 #define DECLARE_DISPLAY_ITEM_TYPE(name, flags) \
42   case DisplayItemType::TYPE_##name:           \
43     return #name;
44 #include "nsDisplayItemTypesList.h"
45 #undef DECLARE_DISPLAY_ITEM_TYPE
46 
47     default:
48       return "TYPE_UNKNOWN";
49   }
50 }
51 
GetDisplayItemFlagsForType(DisplayItemType aType)52 inline uint8_t GetDisplayItemFlagsForType(DisplayItemType aType) {
53   static const uint8_t flags[static_cast<uint32_t>(DisplayItemType::TYPE_MAX)] =
54       {0
55 #define DECLARE_DISPLAY_ITEM_TYPE(name, flags) , flags
56 #include "nsDisplayItemTypesList.h"
57 #undef DECLARE_DISPLAY_ITEM_TYPE
58       };
59 
60   return flags[static_cast<uint32_t>(aType)];
61 }
62 
GetDisplayItemTypeFromKey(uint32_t aDisplayItemKey)63 inline DisplayItemType GetDisplayItemTypeFromKey(uint32_t aDisplayItemKey) {
64   static const uint32_t typeMask = (1 << TYPE_BITS) - 1;
65   DisplayItemType type =
66       static_cast<DisplayItemType>(aDisplayItemKey & typeMask);
67   NS_ASSERTION(
68       type >= DisplayItemType::TYPE_ZERO && type < DisplayItemType::TYPE_MAX,
69       "Invalid display item type!");
70   return type;
71 }
72 
73 #endif /*NSDISPLAYITEMTYPES_H_*/
74