parcelable_composer_layer.cpp revision 730c89a8042e277304a90bff180348fcda75d5a7
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
8namespace android {
9namespace dvr {
10
11ParcelableComposerLayer::ParcelableComposerLayer() {}
12
13ParcelableComposerLayer::ParcelableComposerLayer(
14    const ComposerView::ComposerLayer& layer) : layer_(layer) {}
15
16ParcelableComposerLayer::~ParcelableComposerLayer() {}
17
18status_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
116status_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