GPU workaround to simulate Out of Memory errors with large textures
[chromium-blink-merge.git] / device / hid / hid_report_descriptor_item.h
blobd3392330709e6d3928b2a2cc3b4f54b2fa61acb0
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
3 // found in the LICENSE file.
5 #ifndef DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_
6 #define DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_
8 #include "base/basictypes.h"
10 namespace device {
12 // An element of a HID report descriptor.
13 class HidReportDescriptorItem {
14 private:
15 friend class HidReportDescriptor;
17 enum Type {
18 kTypeMain = 0,
19 kTypeGlobal = 1,
20 kTypeLocal = 2,
21 kTypeReserved = 3
24 enum MainTag {
25 kMainTagDefault = 0x00, // 0000
26 kMainTagInput = 0x08, // 1000
27 kMainTagOutput = 0x09, // 1001
28 kMainTagFeature = 0x0B, // 1011
29 kMainTagCollection = 0x0A, // 1010
30 kMainTagEndCollection = 0x0C // 1100
33 enum GlobalTag {
34 kGlobalTagUsagePage = 0x00, // 0000
35 kGlobalTagLogicalMinimum = 0x01, // 0001
36 kGlobalTagLogicalMaximum = 0x02, // 0010
37 kGlobalTagPhysicalMinimum = 0x03, // 0011
38 kGlobalTagPhysicalMaximum = 0x04, // 0100
39 kGlobalTagUnitExponent = 0x05, // 0101
40 kGlobalTagUnit = 0x06, // 0110
41 kGlobalTagReportSize = 0x07, // 0111
42 kGlobalTagReportId = 0x08, // 1000
43 kGlobalTagReportCount = 0x09, // 1001
44 kGlobalTagPush = 0x0A, // 1010
45 kGlobalTagPop = 0x0B // 1011
48 enum LocalTag {
49 kLocalTagUsage = 0x00, // 0000
50 kLocalTagUsageMinimum = 0x01, // 0001
51 kLocalTagUsageMaximum = 0x02, // 0010
52 kLocalTagDesignatorIndex = 0x03, // 0011
53 kLocalTagDesignatorMinimum = 0x04, // 0100
54 kLocalTagDesignatorMaximum = 0x05, // 0101
55 kLocalTagStringIndex = 0x07, // 0111
56 kLocalTagStringMinimum = 0x08, // 1000
57 kLocalTagStringMaximum = 0x09, // 1001
58 kLocalTagDelimiter = 0x0A // 1010
61 enum ReservedTag {
62 kReservedTagLong = 0xF // 1111
65 public:
66 enum Tag {
67 kTagDefault = kMainTagDefault << 2 | kTypeMain,
68 kTagInput = kMainTagInput << 2 | kTypeMain,
69 kTagOutput = kMainTagOutput << 2 | kTypeMain,
70 kTagFeature = kMainTagFeature << 2 | kTypeMain,
71 kTagCollection = kMainTagCollection << 2 | kTypeMain,
72 kTagEndCollection = kMainTagEndCollection << 2 | kTypeMain,
73 kTagUsagePage = kGlobalTagUsagePage << 2 | kTypeGlobal,
74 kTagLogicalMinimum = kGlobalTagLogicalMinimum << 2 | kTypeGlobal,
75 kTagLogicalMaximum = kGlobalTagLogicalMaximum << 2 | kTypeGlobal,
76 kTagPhysicalMinimum = kGlobalTagPhysicalMinimum << 2 | kTypeGlobal,
77 kTagPhysicalMaximum = kGlobalTagPhysicalMaximum << 2 | kTypeGlobal,
78 kTagUnitExponent = kGlobalTagUnitExponent << 2 | kTypeGlobal,
79 kTagUnit = kGlobalTagUnit << 2 | kTypeGlobal,
80 kTagReportSize = kGlobalTagReportSize << 2 | kTypeGlobal,
81 kTagReportId = kGlobalTagReportId << 2 | kTypeGlobal,
82 kTagReportCount = kGlobalTagReportCount << 2 | kTypeGlobal,
83 kTagPush = kGlobalTagPush << 2 | kTypeGlobal,
84 kTagPop = kGlobalTagPop << 2 | kTypeGlobal,
85 kTagUsage = kLocalTagUsage << 2 | kTypeLocal,
86 kTagUsageMinimum = kLocalTagUsageMinimum << 2 | kTypeLocal,
87 kTagUsageMaximum = kLocalTagUsageMaximum << 2 | kTypeLocal,
88 kTagDesignatorIndex = kLocalTagDesignatorIndex << 2 | kTypeLocal,
89 kTagDesignatorMinimum = kLocalTagDesignatorMinimum << 2 | kTypeLocal,
90 kTagDesignatorMaximum = kLocalTagDesignatorMaximum << 2 | kTypeLocal,
91 kTagStringIndex = kLocalTagStringIndex << 2 | kTypeLocal,
92 kTagStringMinimum = kLocalTagStringMinimum << 2 | kTypeLocal,
93 kTagStringMaximum = kLocalTagStringMaximum << 2 | kTypeLocal,
94 kTagDelimiter = kLocalTagDelimiter << 2 | kTypeLocal,
95 kTagLong = kReservedTagLong << 2 | kTypeReserved
98 // HID Input/Output/Feature report information.
99 // Can be retrieved from GetShortData()
100 // when item.tag() == HidReportDescriptorItem::kTagInput
101 // or HidReportDescriptorItem::kTagOutput
102 // or HidReportDescriptorItem::kTagFeature
103 struct ReportInfo {
104 uint8_t data_or_constant : 1;
105 uint8_t array_or_variable : 1;
106 uint8_t absolute_or_relative : 1;
107 uint8_t wrap : 1;
108 uint8_t linear : 1;
109 uint8_t preferred : 1;
110 uint8_t null : 1;
111 uint8_t reserved_1 : 1;
112 uint8_t bit_field_or_buffer : 1;
113 uint8_t reserved_2 : 1;
116 // HID collection type.
117 // Can be retrieved from GetShortData()
118 // when item.tag() == HidReportDescriptorItem::kTagCollection
119 enum CollectionType {
120 kCollectionTypePhysical,
121 kCollectionTypeApplication,
122 kCollectionTypeLogical,
123 kCollectionTypeReport,
124 kCollectionTypeNamedArray,
125 kCollectionTypeUsageSwitch,
126 kCollectionTypeUsageModifier,
127 kCollectionTypeReserved,
128 kCollectionTypeVendor
131 private:
132 HidReportDescriptorItem(const uint8_t* bytes,
133 HidReportDescriptorItem* previous);
135 public:
136 ~HidReportDescriptorItem() {}
138 // Previous element in report descriptor.
139 // Owned by descriptor instance.
140 HidReportDescriptorItem* previous() const {
141 return previous_;
143 // Next element in report descriptor.
144 // Owned by descriptor instance.
145 HidReportDescriptorItem* next() const {
146 return next_;
148 // Parent element in report descriptor.
149 // Owned by descriptor instance.
150 // Can be NULL.
151 HidReportDescriptorItem* parent() const {
152 return parent_;
154 // Level in Parent-Children relationship tree.
155 // 0 for top-level items (parent()==NULL).
156 // 1 if parent() is top-level.
157 // 2 if parent() has a top-level parent. Etc.
158 size_t GetDepth() const;
159 Tag tag() const { return tag_; }
160 // Returns true for a long item, false otherwise.
161 bool IsLong() const;
162 // Raw data of a short item.
163 // Not valid for a long item.
164 uint32_t GetShortData() const;
166 static CollectionType GetCollectionTypeFromValue(uint32_t value);
168 private:
169 size_t GetHeaderSize() const;
170 size_t payload_size() const { return payload_size_; }
171 size_t GetSize() const;
173 HidReportDescriptorItem* previous_;
174 HidReportDescriptorItem* next_;
175 HidReportDescriptorItem* parent_;
176 Tag tag_;
177 uint32_t shortData_;
178 size_t payload_size_;
181 } // namespace device
183 #endif // DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_