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()11ParcelableComposerLayer::ParcelableComposerLayer() {} 12 ParcelableComposerLayer(const ComposerView::ComposerLayer & layer)13ParcelableComposerLayer::ParcelableComposerLayer( 14 const ComposerView::ComposerLayer& layer) : layer_(layer) {} 15 ~ParcelableComposerLayer()16ParcelableComposerLayer::~ParcelableComposerLayer() {} 17 writeToParcel(Parcel * parcel) const18status_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)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