| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <utils/Errors.h> |
| #include <binder/Parcel.h> |
| #include <gui/ISurfaceComposerClient.h> |
| #include <gui/IGraphicBufferProducer.h> |
| #include <gui/LayerState.h> |
| |
| namespace android { |
| |
| status_t layer_state_t::write(Parcel& output) const |
| { |
| output.writeStrongBinder(surface); |
| output.writeUint32(what); |
| output.writeFloat(x); |
| output.writeFloat(y); |
| output.writeInt32(z); |
| output.writeUint32(w); |
| output.writeUint32(h); |
| output.writeUint32(layerStack); |
| output.writeFloat(alpha); |
| output.writeUint32(flags); |
| output.writeUint32(mask); |
| *reinterpret_cast<layer_state_t::matrix22_t *>( |
| output.writeInplace(sizeof(layer_state_t::matrix22_t))) = matrix; |
| output.write(crop); |
| output.write(finalCrop); |
| output.writeStrongBinder(barrierHandle); |
| output.writeStrongBinder(reparentHandle); |
| output.writeUint64(frameNumber); |
| output.writeInt32(overrideScalingMode); |
| output.writeStrongBinder(IInterface::asBinder(barrierGbp)); |
| output.writeStrongBinder(relativeLayerHandle); |
| output.writeStrongBinder(parentHandleForChild); |
| output.writeFloat(color.r); |
| output.writeFloat(color.g); |
| output.writeFloat(color.b); |
| output.write(transparentRegion); |
| return NO_ERROR; |
| } |
| |
| status_t layer_state_t::read(const Parcel& input) |
| { |
| surface = input.readStrongBinder(); |
| what = input.readUint32(); |
| x = input.readFloat(); |
| y = input.readFloat(); |
| z = input.readInt32(); |
| w = input.readUint32(); |
| h = input.readUint32(); |
| layerStack = input.readUint32(); |
| alpha = input.readFloat(); |
| flags = static_cast<uint8_t>(input.readUint32()); |
| mask = static_cast<uint8_t>(input.readUint32()); |
| const void* matrix_data = input.readInplace(sizeof(layer_state_t::matrix22_t)); |
| if (matrix_data) { |
| matrix = *reinterpret_cast<layer_state_t::matrix22_t const *>(matrix_data); |
| } else { |
| return BAD_VALUE; |
| } |
| input.read(crop); |
| input.read(finalCrop); |
| barrierHandle = input.readStrongBinder(); |
| reparentHandle = input.readStrongBinder(); |
| frameNumber = input.readUint64(); |
| overrideScalingMode = input.readInt32(); |
| barrierGbp = |
| interface_cast<IGraphicBufferProducer>(input.readStrongBinder()); |
| relativeLayerHandle = input.readStrongBinder(); |
| parentHandleForChild = input.readStrongBinder(); |
| color.r = input.readFloat(); |
| color.g = input.readFloat(); |
| color.b = input.readFloat(); |
| input.read(transparentRegion); |
| return NO_ERROR; |
| } |
| |
| status_t ComposerState::write(Parcel& output) const { |
| output.writeStrongBinder(IInterface::asBinder(client)); |
| return state.write(output); |
| } |
| |
| status_t ComposerState::read(const Parcel& input) { |
| client = interface_cast<ISurfaceComposerClient>(input.readStrongBinder()); |
| return state.read(input); |
| } |
| |
| |
| DisplayState::DisplayState() : |
| what(0), |
| layerStack(0), |
| orientation(eOrientationDefault), |
| viewport(Rect::EMPTY_RECT), |
| frame(Rect::EMPTY_RECT), |
| width(0), |
| height(0) { |
| } |
| |
| status_t DisplayState::write(Parcel& output) const { |
| output.writeStrongBinder(token); |
| output.writeStrongBinder(IInterface::asBinder(surface)); |
| output.writeUint32(what); |
| output.writeUint32(layerStack); |
| output.writeUint32(orientation); |
| output.write(viewport); |
| output.write(frame); |
| output.writeUint32(width); |
| output.writeUint32(height); |
| return NO_ERROR; |
| } |
| |
| status_t DisplayState::read(const Parcel& input) { |
| token = input.readStrongBinder(); |
| surface = interface_cast<IGraphicBufferProducer>(input.readStrongBinder()); |
| what = input.readUint32(); |
| layerStack = input.readUint32(); |
| orientation = input.readUint32(); |
| input.read(viewport); |
| input.read(frame); |
| width = input.readUint32(); |
| height = input.readUint32(); |
| return NO_ERROR; |
| } |
| |
| void DisplayState::merge(const DisplayState& other) { |
| if (other.what & eSurfaceChanged) { |
| what |= eSurfaceChanged; |
| surface = other.surface; |
| } |
| if (other.what & eLayerStackChanged) { |
| what |= eLayerStackChanged; |
| layerStack = other.layerStack; |
| } |
| if (other.what & eDisplayProjectionChanged) { |
| what |= eDisplayProjectionChanged; |
| orientation = other.orientation; |
| viewport = other.viewport; |
| frame = other.frame; |
| } |
| if (other.what & eDisplaySizeChanged) { |
| what |= eDisplaySizeChanged; |
| width = other.width; |
| height = other.height; |
| } |
| } |
| |
| void layer_state_t::merge(const layer_state_t& other) { |
| if (other.what & ePositionChanged) { |
| what |= ePositionChanged; |
| x = other.x; |
| y = other.y; |
| } |
| if (other.what & eLayerChanged) { |
| what |= eLayerChanged; |
| z = other.z; |
| } |
| if (other.what & eSizeChanged) { |
| what |= eSizeChanged; |
| w = other.w; |
| h = other.h; |
| } |
| if (other.what & eAlphaChanged) { |
| what |= eAlphaChanged; |
| alpha = other.alpha; |
| } |
| if (other.what & eMatrixChanged) { |
| what |= eMatrixChanged; |
| matrix = other.matrix; |
| } |
| if (other.what & eTransparentRegionChanged) { |
| what |= eTransparentRegionChanged; |
| transparentRegion = other.transparentRegion; |
| } |
| if (other.what & eFlagsChanged) { |
| what |= eFlagsChanged; |
| flags = other.flags; |
| mask = other.mask; |
| } |
| if (other.what & eLayerStackChanged) { |
| what |= eLayerStackChanged; |
| layerStack = other.layerStack; |
| } |
| if (other.what & eCropChanged) { |
| what |= eCropChanged; |
| crop = other.crop; |
| } |
| if (other.what & eDeferTransaction) { |
| what |= eDeferTransaction; |
| barrierHandle = other.barrierHandle; |
| barrierGbp = other.barrierGbp; |
| frameNumber = other.frameNumber; |
| } |
| if (other.what & eFinalCropChanged) { |
| what |= eFinalCropChanged; |
| finalCrop = other.finalCrop; |
| } |
| if (other.what & eOverrideScalingModeChanged) { |
| what |= eOverrideScalingModeChanged; |
| overrideScalingMode = other.overrideScalingMode; |
| } |
| if (other.what & eGeometryAppliesWithResize) { |
| what |= eGeometryAppliesWithResize; |
| } |
| if (other.what & eReparentChildren) { |
| what |= eReparentChildren; |
| reparentHandle = other.reparentHandle; |
| } |
| if (other.what & eDetachChildren) { |
| what |= eDetachChildren; |
| } |
| if (other.what & eRelativeLayerChanged) { |
| what |= eRelativeLayerChanged; |
| z = other.z; |
| relativeLayerHandle = other.relativeLayerHandle; |
| } |
| if (other.what & eReparent) { |
| what |= eReparent; |
| parentHandleForChild = other.parentHandleForChild; |
| } |
| if (other.what & eDestroySurface) { |
| what |= eDestroySurface; |
| } |
| } |
| |
| }; // namespace android |