Home | History | Annotate | Download | only in gui
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <utils/Errors.h>
     18 #include <binder/Parcel.h>
     19 #include <gui/ISurfaceComposerClient.h>
     20 #include <gui/IGraphicBufferProducer.h>
     21 #include <gui/LayerState.h>
     22 
     23 namespace android {
     24 
     25 status_t layer_state_t::write(Parcel& output) const
     26 {
     27     output.writeStrongBinder(surface);
     28     output.writeUint32(what);
     29     output.writeFloat(x);
     30     output.writeFloat(y);
     31     output.writeInt32(z);
     32     output.writeUint32(w);
     33     output.writeUint32(h);
     34     output.writeUint32(layerStack);
     35     output.writeFloat(alpha);
     36     output.writeUint32(flags);
     37     output.writeUint32(mask);
     38     *reinterpret_cast<layer_state_t::matrix22_t *>(
     39             output.writeInplace(sizeof(layer_state_t::matrix22_t))) = matrix;
     40     output.write(crop);
     41     output.write(finalCrop);
     42     output.writeStrongBinder(barrierHandle);
     43     output.writeStrongBinder(reparentHandle);
     44     output.writeUint64(frameNumber);
     45     output.writeInt32(overrideScalingMode);
     46     output.writeStrongBinder(IInterface::asBinder(barrierGbp));
     47     output.writeStrongBinder(relativeLayerHandle);
     48     output.writeStrongBinder(parentHandleForChild);
     49     output.writeFloat(color.r);
     50     output.writeFloat(color.g);
     51     output.writeFloat(color.b);
     52     output.write(transparentRegion);
     53     return NO_ERROR;
     54 }
     55 
     56 status_t layer_state_t::read(const Parcel& input)
     57 {
     58     surface = input.readStrongBinder();
     59     what = input.readUint32();
     60     x = input.readFloat();
     61     y = input.readFloat();
     62     z = input.readInt32();
     63     w = input.readUint32();
     64     h = input.readUint32();
     65     layerStack = input.readUint32();
     66     alpha = input.readFloat();
     67     flags = static_cast<uint8_t>(input.readUint32());
     68     mask = static_cast<uint8_t>(input.readUint32());
     69     const void* matrix_data = input.readInplace(sizeof(layer_state_t::matrix22_t));
     70     if (matrix_data) {
     71         matrix = *reinterpret_cast<layer_state_t::matrix22_t const *>(matrix_data);
     72     } else {
     73         return BAD_VALUE;
     74     }
     75     input.read(crop);
     76     input.read(finalCrop);
     77     barrierHandle = input.readStrongBinder();
     78     reparentHandle = input.readStrongBinder();
     79     frameNumber = input.readUint64();
     80     overrideScalingMode = input.readInt32();
     81     barrierGbp =
     82         interface_cast<IGraphicBufferProducer>(input.readStrongBinder());
     83     relativeLayerHandle = input.readStrongBinder();
     84     parentHandleForChild = input.readStrongBinder();
     85     color.r = input.readFloat();
     86     color.g = input.readFloat();
     87     color.b = input.readFloat();
     88     input.read(transparentRegion);
     89     return NO_ERROR;
     90 }
     91 
     92 status_t ComposerState::write(Parcel& output) const {
     93     output.writeStrongBinder(IInterface::asBinder(client));
     94     return state.write(output);
     95 }
     96 
     97 status_t ComposerState::read(const Parcel& input) {
     98     client = interface_cast<ISurfaceComposerClient>(input.readStrongBinder());
     99     return state.read(input);
    100 }
    101 
    102 
    103 DisplayState::DisplayState() :
    104     what(0),
    105     layerStack(0),
    106     orientation(eOrientationDefault),
    107     viewport(Rect::EMPTY_RECT),
    108     frame(Rect::EMPTY_RECT),
    109     width(0),
    110     height(0) {
    111 }
    112 
    113 status_t DisplayState::write(Parcel& output) const {
    114     output.writeStrongBinder(token);
    115     output.writeStrongBinder(IInterface::asBinder(surface));
    116     output.writeUint32(what);
    117     output.writeUint32(layerStack);
    118     output.writeUint32(orientation);
    119     output.write(viewport);
    120     output.write(frame);
    121     output.writeUint32(width);
    122     output.writeUint32(height);
    123     return NO_ERROR;
    124 }
    125 
    126 status_t DisplayState::read(const Parcel& input) {
    127     token = input.readStrongBinder();
    128     surface = interface_cast<IGraphicBufferProducer>(input.readStrongBinder());
    129     what = input.readUint32();
    130     layerStack = input.readUint32();
    131     orientation = input.readUint32();
    132     input.read(viewport);
    133     input.read(frame);
    134     width = input.readUint32();
    135     height = input.readUint32();
    136     return NO_ERROR;
    137 }
    138 
    139 void DisplayState::merge(const DisplayState& other) {
    140     if (other.what & eSurfaceChanged) {
    141         what |= eSurfaceChanged;
    142         surface = other.surface;
    143     }
    144     if (other.what & eLayerStackChanged) {
    145         what |= eLayerStackChanged;
    146         layerStack = other.layerStack;
    147     }
    148     if (other.what & eDisplayProjectionChanged) {
    149         what |= eDisplayProjectionChanged;
    150         orientation = other.orientation;
    151         viewport = other.viewport;
    152         frame = other.frame;
    153     }
    154     if (other.what & eDisplaySizeChanged) {
    155         what |= eDisplaySizeChanged;
    156         width = other.width;
    157         height = other.height;
    158     }
    159 }
    160 
    161 void layer_state_t::merge(const layer_state_t& other) {
    162     if (other.what & ePositionChanged) {
    163         what |= ePositionChanged;
    164         x = other.x;
    165         y = other.y;
    166     }
    167     if (other.what & eLayerChanged) {
    168         what |= eLayerChanged;
    169         z = other.z;
    170     }
    171     if (other.what & eSizeChanged) {
    172         what |= eSizeChanged;
    173         w = other.w;
    174         h = other.h;
    175     }
    176     if (other.what & eAlphaChanged) {
    177         what |= eAlphaChanged;
    178         alpha = other.alpha;
    179     }
    180     if (other.what & eMatrixChanged) {
    181         what |= eMatrixChanged;
    182         matrix = other.matrix;
    183     }
    184     if (other.what & eTransparentRegionChanged) {
    185         what |= eTransparentRegionChanged;
    186         transparentRegion = other.transparentRegion;
    187     }
    188     if (other.what & eFlagsChanged) {
    189         what |= eFlagsChanged;
    190         flags = other.flags;
    191         mask = other.mask;
    192     }
    193     if (other.what & eLayerStackChanged) {
    194         what |= eLayerStackChanged;
    195         layerStack = other.layerStack;
    196     }
    197     if (other.what & eCropChanged) {
    198         what |= eCropChanged;
    199         crop = other.crop;
    200     }
    201     if (other.what & eDeferTransaction) {
    202         what |= eDeferTransaction;
    203         barrierHandle = other.barrierHandle;
    204         barrierGbp = other.barrierGbp;
    205         frameNumber = other.frameNumber;
    206     }
    207     if (other.what & eFinalCropChanged) {
    208         what |= eFinalCropChanged;
    209         finalCrop = other.finalCrop;
    210     }
    211     if (other.what & eOverrideScalingModeChanged) {
    212         what |= eOverrideScalingModeChanged;
    213         overrideScalingMode = other.overrideScalingMode;
    214     }
    215     if (other.what & eGeometryAppliesWithResize) {
    216         what |= eGeometryAppliesWithResize;
    217     }
    218     if (other.what & eReparentChildren) {
    219         what |= eReparentChildren;
    220         reparentHandle = other.reparentHandle;
    221     }
    222     if (other.what & eDetachChildren) {
    223         what |= eDetachChildren;
    224     }
    225     if (other.what & eRelativeLayerChanged) {
    226         what |= eRelativeLayerChanged;
    227         z = other.z;
    228         relativeLayerHandle = other.relativeLayerHandle;
    229     }
    230     if (other.what & eReparent) {
    231         what |= eReparent;
    232         parentHandleForChild = other.parentHandleForChild;
    233     }
    234     if (other.what & eDestroySurface) {
    235         what |= eDestroySurface;
    236     }
    237 }
    238 
    239 }; // namespace android
    240