@@ -59,6 +59,32 @@ std::ostream& operator<<(std::ostream& out, const Region& region) {
5959 return out;
6060}
6161
62+ status_t writeTransform (android::Parcel* parcel, const ui::Transform& transform) {
63+ return parcel->writeFloat (transform.dsdx ()) ?:
64+ parcel->writeFloat (transform.dtdx ()) ?:
65+ parcel->writeFloat (transform.tx ()) ?:
66+ parcel->writeFloat (transform.dtdy ()) ?:
67+ parcel->writeFloat (transform.dsdy ()) ?:
68+ parcel->writeFloat (transform.ty ());
69+ }
70+
71+ status_t readTransform (const android::Parcel* parcel, ui::Transform& transform) {
72+ float dsdx, dtdx, tx, dtdy, dsdy, ty;
73+
74+ const status_t status = parcel->readFloat (&dsdx) ?:
75+ parcel->readFloat (&dtdx) ?:
76+ parcel->readFloat (&tx) ?:
77+ parcel->readFloat (&dtdy) ?:
78+ parcel->readFloat (&dsdy) ?:
79+ parcel->readFloat (&ty);
80+ if (status != OK) {
81+ return status;
82+ }
83+
84+ transform.set ({dsdx, dtdx, tx, dtdy, dsdy, ty, 0 , 0 , 1 });
85+ return OK;
86+ }
87+
6288} // namespace
6389
6490void WindowInfo::setInputConfig (ftl::Flags<InputConfig> config, bool value) {
@@ -135,12 +161,7 @@ status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
135161 parcel->writeInt32 (surfaceInset) ?:
136162 parcel->writeFloat (globalScaleFactor) ?:
137163 parcel->writeFloat (alpha) ?:
138- parcel->writeFloat (transform.dsdx ()) ?:
139- parcel->writeFloat (transform.dtdx ()) ?:
140- parcel->writeFloat (transform.tx ()) ?:
141- parcel->writeFloat (transform.dtdy ()) ?:
142- parcel->writeFloat (transform.dsdy ()) ?:
143- parcel->writeFloat (transform.ty ()) ?:
164+ writeTransform (parcel, transform) ?:
144165 parcel->writeInt32 (static_cast <int32_t >(touchOcclusionMode)) ?:
145166 parcel->writeInt32 (ownerPid.val ()) ?:
146167 parcel->writeInt32 (ownerUid.val ()) ?:
@@ -153,8 +174,12 @@ status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
153174 parcel->writeStrongBinder (touchableRegionCropHandle.promote ()) ?:
154175 parcel->writeStrongBinder (windowToken) ?:
155176 parcel->writeStrongBinder (focusTransferTarget) ?:
156- parcel->writeBool (canOccludePresentation);
177+ parcel->writeBool (canOccludePresentation) ?:
178+ parcel->writeBool (cloneLayerStackTransform.has_value ());
157179 // clang-format on
180+ if (cloneLayerStackTransform) {
181+ status = status ?: writeTransform (parcel, *cloneLayerStackTransform);
182+ }
158183 return status;
159184}
160185
@@ -174,10 +199,10 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
174199 return status;
175200 }
176201
177- float dsdx, dtdx, tx, dtdy, dsdy, ty;
178202 int32_t lpFlags, lpType, touchOcclusionModeInt, inputConfigInt, ownerPidInt, ownerUidInt,
179203 displayIdInt;
180204 sp<IBinder> touchableRegionCropHandleSp;
205+ bool hasCloneLayerStackTransform = false ;
181206
182207 // clang-format off
183208 status = parcel->readInt32 (&lpFlags) ?:
@@ -188,12 +213,7 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
188213 parcel->readInt32 (&surfaceInset) ?:
189214 parcel->readFloat (&globalScaleFactor) ?:
190215 parcel->readFloat (&alpha) ?:
191- parcel->readFloat (&dsdx) ?:
192- parcel->readFloat (&dtdx) ?:
193- parcel->readFloat (&tx) ?:
194- parcel->readFloat (&dtdy) ?:
195- parcel->readFloat (&dsdy) ?:
196- parcel->readFloat (&ty) ?:
216+ readTransform (parcel, /* byRef*/ transform) ?:
197217 parcel->readInt32 (&touchOcclusionModeInt) ?:
198218 parcel->readInt32 (&ownerPidInt) ?:
199219 parcel->readInt32 (&ownerUidInt) ?:
@@ -206,8 +226,8 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
206226 parcel->readNullableStrongBinder (&touchableRegionCropHandleSp) ?:
207227 parcel->readNullableStrongBinder (&windowToken) ?:
208228 parcel->readNullableStrongBinder (&focusTransferTarget) ?:
209- parcel->readBool (&canOccludePresentation);
210-
229+ parcel->readBool (&canOccludePresentation)?:
230+ parcel-> readBool (&hasCloneLayerStackTransform);
211231 // clang-format on
212232
213233 if (status != OK) {
@@ -216,14 +236,22 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
216236
217237 layoutParamsFlags = ftl::Flags<Flag>(lpFlags);
218238 layoutParamsType = static_cast <Type>(lpType);
219- transform.set ({dsdx, dtdx, tx, dtdy, dsdy, ty, 0 , 0 , 1 });
220239 touchOcclusionMode = static_cast <TouchOcclusionMode>(touchOcclusionModeInt);
221240 inputConfig = ftl::Flags<InputConfig>(inputConfigInt);
222241 ownerPid = Pid{ownerPidInt};
223242 ownerUid = Uid{static_cast <uid_t >(ownerUidInt)};
224243 touchableRegionCropHandle = touchableRegionCropHandleSp;
225244 displayId = ui::LogicalDisplayId{displayIdInt};
226245
246+ cloneLayerStackTransform =
247+ hasCloneLayerStackTransform ? std::make_optional<ui::Transform>() : std::nullopt ;
248+ if (cloneLayerStackTransform) {
249+ status = readTransform (parcel, /* byRef*/ *cloneLayerStackTransform);
250+ if (status != OK) {
251+ return status;
252+ }
253+ }
254+
227255 return OK;
228256}
229257
0 commit comments