1 #include "aidl/android/dvr/parcelable_composer_layer.h"
2 
3 #include <binder/Parcel.h>
4 #include <ui/Fence.h>
5 #include <ui/GraphicBuffer.h>
6 #include <ui/GraphicBufferMapper.h>
7 
8 namespace android {
9 namespace dvr {
10 
ParcelableComposerLayer()11 ParcelableComposerLayer::ParcelableComposerLayer() {}
12 
ParcelableComposerLayer(const ComposerView::ComposerLayer & layer)13 ParcelableComposerLayer::ParcelableComposerLayer(
14     const ComposerView::ComposerLayer& layer) : layer_(layer) {}
15 
~ParcelableComposerLayer()16 ParcelableComposerLayer::~ParcelableComposerLayer() {}
17 
writeToParcel(Parcel * parcel) const18 status_t ParcelableComposerLayer::writeToParcel(Parcel* parcel) const {
19   status_t ret = parcel->writeUint64(layer_.id);
20   if (ret != OK) return ret;
21 
22   ret = parcel->write(*layer_.buffer);
23   if (ret != OK) return ret;
24 
25   ret = parcel->writeBool(layer_.fence->isValid());
26   if (ret != OK) return ret;
27 
28   if (layer_.fence->isValid()) {
29     ret = parcel->writeFileDescriptor(layer_.fence->dup(), true);
30     if (ret != OK) return ret;
31   }
32 
33   ret = parcel->writeInt32(layer_.display_frame.left);
34   if (ret != OK) return ret;
35 
36   ret = parcel->writeInt32(layer_.display_frame.top);
37   if (ret != OK) return ret;
38 
39   ret = parcel->writeInt32(layer_.display_frame.right);
40   if (ret != OK) return ret;
41 
42   ret = parcel->writeInt32(layer_.display_frame.bottom);
43   if (ret != OK) return ret;
44 
45   ret = parcel->writeFloat(layer_.crop.left);
46   if (ret != OK) return ret;
47 
48   ret = parcel->writeFloat(layer_.crop.top);
49   if (ret != OK) return ret;
50 
51   ret = parcel->writeFloat(layer_.crop.right);
52   if (ret != OK) return ret;
53 
54   ret = parcel->writeFloat(layer_.crop.bottom);
55   if (ret != OK) return ret;
56 
57   ret = parcel->writeInt32(static_cast<int32_t>(layer_.blend_mode));
58   if (ret != OK) return ret;
59 
60   ret = parcel->writeFloat(layer_.alpha);
61   if (ret != OK) return ret;
62 
63   ret = parcel->writeUint32(layer_.type);
64   if (ret != OK) return ret;
65 
66   ret = parcel->writeUint32(layer_.app_id);
67   if (ret != OK) return ret;
68 
69   ret = parcel->writeUint32(layer_.z_order);
70   if (ret != OK) return ret;
71 
72   ret = parcel->writeInt32(layer_.cursor_x);
73   if (ret != OK) return ret;
74 
75   ret = parcel->writeInt32(layer_.cursor_y);
76   if (ret != OK) return ret;
77 
78   uint32_t color = layer_.color.r |
79       (static_cast<uint32_t>(layer_.color.g) << 8) |
80       (static_cast<uint32_t>(layer_.color.b) << 16) |
81       (static_cast<uint32_t>(layer_.color.a) << 24);
82   ret = parcel->writeUint32(color);
83   if (ret != OK) return ret;
84 
85   ret = parcel->writeInt32(layer_.dataspace);
86   if (ret != OK) return ret;
87 
88   ret = parcel->writeInt32(layer_.transform);
89   if (ret != OK) return ret;
90 
91   ret = parcel->writeUint32(static_cast<uint32_t>(layer_.visible_regions.size()));
92   if (ret != OK) return ret;
93 
94   for (auto& rect: layer_.visible_regions) {
95     ret = parcel->writeInt32(rect.left);
96     ret = parcel->writeInt32(rect.top);
97     ret = parcel->writeInt32(rect.right);
98     ret = parcel->writeInt32(rect.bottom);
99     if (ret != OK) return ret;
100   }
101 
102   ret = parcel->writeUint32(static_cast<uint32_t>(layer_.damaged_regions.size()));
103   if (ret != OK) return ret;
104 
105   for (auto& rect: layer_.damaged_regions) {
106     ret = parcel->writeInt32(rect.left);
107     ret = parcel->writeInt32(rect.top);
108     ret = parcel->writeInt32(rect.right);
109     ret = parcel->writeInt32(rect.bottom);
110     if (ret != OK) return ret;
111   }
112 
113   return OK;
114 }
115 
readFromParcel(const Parcel * parcel)116 status_t ParcelableComposerLayer::readFromParcel(const Parcel* parcel) {
117   status_t ret = parcel->readUint64(&layer_.id);
118   if (ret != OK) return ret;
119 
120   layer_.buffer = new GraphicBuffer();
121   ret = parcel->read(*layer_.buffer);
122   if (ret != OK) {
123     layer_.buffer.clear();
124     return ret;
125   }
126 
127   bool has_fence = 0;
128   ret = parcel->readBool(&has_fence);
129   if (ret != OK) return ret;
130 
131   if (has_fence)
132     layer_.fence = new Fence(dup(parcel->readFileDescriptor()));
133   else
134     layer_.fence = new Fence();
135 
136   ret = parcel->readInt32(&layer_.display_frame.left);
137   if (ret != OK) return ret;
138 
139   ret = parcel->readInt32(&layer_.display_frame.top);
140   if (ret != OK) return ret;
141 
142   ret = parcel->readInt32(&layer_.display_frame.right);
143   if (ret != OK) return ret;
144 
145   ret = parcel->readInt32(&layer_.display_frame.bottom);
146   if (ret != OK) return ret;
147 
148   ret = parcel->readFloat(&layer_.crop.left);
149   if (ret != OK) return ret;
150 
151   ret = parcel->readFloat(&layer_.crop.top);
152   if (ret != OK) return ret;
153 
154   ret = parcel->readFloat(&layer_.crop.right);
155   if (ret != OK) return ret;
156 
157   ret = parcel->readFloat(&layer_.crop.bottom);
158   if (ret != OK) return ret;
159 
160   ret = parcel->readInt32(reinterpret_cast<int32_t*>(&layer_.blend_mode));
161   if (ret != OK) return ret;
162 
163   ret = parcel->readFloat(&layer_.alpha);
164   if (ret != OK) return ret;
165 
166   ret = parcel->readUint32(&layer_.type);
167   if (ret != OK) return ret;
168 
169   ret = parcel->readUint32(&layer_.app_id);
170   if (ret != OK) return ret;
171 
172   ret = parcel->readUint32(&layer_.z_order);
173   if (ret != OK) return ret;
174 
175   ret = parcel->readInt32(&layer_.cursor_x);
176   if (ret != OK) return ret;
177 
178   ret = parcel->readInt32(&layer_.cursor_y);
179   if (ret != OK) return ret;
180 
181   uint32_t color;
182   ret = parcel->readUint32(&color);
183   if (ret != OK) return ret;
184   layer_.color.r = color & 0xFF;
185   layer_.color.g = (color >> 8) & 0xFF;
186   layer_.color.b = (color >> 16) & 0xFF;
187   layer_.color.a = (color >> 24) & 0xFF;
188 
189   ret = parcel->readInt32(&layer_.dataspace);
190   if (ret != OK) return ret;
191 
192   ret = parcel->readInt32(&layer_.transform);
193   if (ret != OK) return ret;
194 
195   uint32_t size;
196   ret = parcel->readUint32(&size);
197   if (ret != OK) return ret;
198 
199   for(size_t i = 0; i < size; i++) {
200     hwc_rect_t rect;
201     ret = parcel->readInt32(&rect.left);
202     if (ret != OK) return ret;
203 
204     ret = parcel->readInt32(&rect.top);
205     if (ret != OK) return ret;
206 
207     ret = parcel->readInt32(&rect.right);
208     if (ret != OK) return ret;
209 
210     ret = parcel->readInt32(&rect.bottom);
211     if (ret != OK) return ret;
212 
213     layer_.visible_regions.push_back(rect);
214   }
215 
216   ret = parcel->readUint32(&size);
217   if (ret != OK) return ret;
218 
219   for(size_t i = 0; i < size; i++) {
220     hwc_rect_t rect;
221     ret = parcel->readInt32(&rect.left);
222     if (ret != OK) return ret;
223 
224     ret = parcel->readInt32(&rect.top);
225     if (ret != OK) return ret;
226 
227     ret = parcel->readInt32(&rect.right);
228     if (ret != OK) return ret;
229 
230     ret = parcel->readInt32(&rect.bottom);
231     if (ret != OK) return ret;
232 
233     layer_.damaged_regions.push_back(rect);
234   }
235 
236   return OK;
237 }
238 
239 }  // namespace dvr
240 }  // namespace android
241