ISurfaceComposerClient.cpp revision 285dbde2e0cd0057be070ded3be8f5f453147edc
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// tag as surfaceflinger 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h> 27c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Point.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 329cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h> 339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceFlingerClient.h> 349cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian/* ideally AID_GRAPHICS would be in a semi-public header 39a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian * or there would be a way to map a user/group name to its id 40a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian */ 41a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#ifndef AID_GRAPHICS 42a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#define AID_GRAPHICS 1003 43a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#endif 44a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GET_CBLK = IBinder::FIRST_CALL_TRANSACTION, 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CREATE_SURFACE, 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DESTROY_SURFACE, 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SET_STATE 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceFlingerClient : public BpInterface<ISurfaceFlingerClient> 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceFlingerClient(const sp<IBinder>& impl) 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceFlingerClient>(impl) 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 677303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian virtual sp<IMemoryHeap> getControlBlock() const 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceFlingerClient::getInterfaceDescriptor()); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(GET_CBLK, data, &reply); 727303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian return interface_cast<IMemoryHeap>(reply.readStrongBinder()); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<ISurface> createSurface( surface_data_t* params, 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int pid, 77285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceFlingerClient::getInterfaceDescriptor()); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(pid); 87285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian data.writeString8(name); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(display); 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(w); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(h); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(format); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(CREATE_SURFACE, data, &reply); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project params->readFromParcel(reply); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return interface_cast<ISurface>(reply.readStrongBinder()); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t destroySurface(SurfaceID sid) 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceFlingerClient::getInterfaceDescriptor()); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(sid); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(DESTROY_SURFACE, data, &reply); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t setState(int32_t count, const layer_state_t* states) 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceFlingerClient::getInterfaceDescriptor()); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(count); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<count ; i++) 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project states[i].write(data); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(SET_STATE, data, &reply); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceFlingerClient, "android.ui.ISurfaceFlingerClient"); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceFlingerClient::onTransact( 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // codes that don't require permission check 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GET_CBLK: { 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(ISurfaceFlingerClient, data, reply); 1317303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian sp<IMemoryHeap> ctl(getControlBlock()); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(ctl->asBinder()); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // these must be checked 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int pid = ipc->getCallingPid(); 141a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian const int uid = ipc->getCallingUid(); 142a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian const int self_pid = getpid(); 143a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian if (UNLIKELY(pid != self_pid && uid != AID_GRAPHICS)) { 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we're called from a different process, do the real check 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!checkCallingPermission( 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String16("android.permission.ACCESS_SURFACE_FLINGER"))) 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("Permission Denial: " 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "can't openGlobalTransaction pid=%d, uid=%d", pid, uid); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return PERMISSION_DENIED; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_SURFACE: { 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(ISurfaceFlingerClient, data, reply); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface_data_t params; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pid = data.readInt32(); 159285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name = data.readString8(); 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display = data.readInt32(); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w = data.readInt32(); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h = data.readInt32(); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format = data.readInt32(); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 165285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian sp<ISurface> s = createSurface(¶ms, pid, name, display, w, h, 166285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian format, flags); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project params.writeToParcel(reply); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(s->asBinder()); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case DESTROY_SURFACE: { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(ISurfaceFlingerClient, data, reply); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( destroySurface( data.readInt32() ) ); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SET_STATE: { 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(ISurfaceFlingerClient, data, reply); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t count = data.readInt32(); 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer_state_t* states = new layer_state_t[count]; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<count ; i++) 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project states[i].read(data); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = setState(count, states); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete [] states; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(err); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t ISurfaceFlingerClient::surface_data_t::readFromParcel(const Parcel& parcel) 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1961c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian token = parcel.readInt32(); 1971c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian identity = parcel.readInt32(); 1981c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian width = parcel.readInt32(); 1991c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian height = parcel.readInt32(); 2001c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian format = parcel.readInt32(); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t ISurfaceFlingerClient::surface_data_t::writeToParcel(Parcel* parcel) const 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project parcel->writeInt32(token); 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project parcel->writeInt32(identity); 2081c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(width); 2091c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(height); 2101c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(format); 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 215