diff options
| author | 2012-04-09 19:46:29 -0700 | |
|---|---|---|
| committer | 2012-04-11 18:37:54 -0700 | |
| commit | 55a701459de964ae3504264a6b8c4dc37f54a9e8 (patch) | |
| tree | 077b6c5ec8d57f8986146fa55662f485eaf31d17 /libs/gui/SurfaceTextureClient.cpp | |
| parent | 562f4b2c1e555b853997113bb54b21303d642bc6 (diff) | |
SurfaceTextureClient: support for application buffer dimensions
Add a new API native_window_set_buffers_user_dimensions to allow native
applications to override the native window size for the default buffer size.
This has lower precedence than the existing
native_window_set_buffers_dimensions and allows the two to co-exist.
Change-Id: Ie73590e1c94ef0dadbce500bd0941dfabbcace3c
Diffstat (limited to 'libs/gui/SurfaceTextureClient.cpp')
| -rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 592658bd38..aa114ed310 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -80,6 +80,8 @@ void SurfaceTextureClient::init() { mTransform = 0; mDefaultWidth = 0; mDefaultHeight = 0; + mUserWidth = 0; + mUserHeight = 0; mTransformHint = 0; mConnectedToCpu = false; } @@ -159,7 +161,9 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) { ALOGV("SurfaceTextureClient::dequeueBuffer"); Mutex::Autolock lock(mMutex); int buf = -1; - status_t result = mSurfaceTexture->dequeueBuffer(&buf, mReqWidth, mReqHeight, + int reqW = mReqWidth ? mReqWidth : mUserWidth; + int reqH = mReqHeight ? mReqHeight : mUserHeight; + status_t result = mSurfaceTexture->dequeueBuffer(&buf, reqW, reqH, mReqFormat, mReqUsage); if (result < 0) { ALOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)" @@ -269,10 +273,10 @@ int SurfaceTextureClient::query(int what, int* value) const { *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT; return NO_ERROR; case NATIVE_WINDOW_DEFAULT_WIDTH: - *value = mDefaultWidth; + *value = mUserWidth ? mUserWidth : mDefaultWidth; return NO_ERROR; case NATIVE_WINDOW_DEFAULT_HEIGHT: - *value = mDefaultHeight; + *value = mUserHeight ? mUserHeight : mDefaultHeight; return NO_ERROR; case NATIVE_WINDOW_TRANSFORM_HINT: *value = mTransformHint; @@ -313,6 +317,9 @@ int SurfaceTextureClient::perform(int operation, va_list args) case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: res = dispatchSetBuffersDimensions(args); break; + case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: + res = dispatchSetBuffersUserDimensions(args); + break; case NATIVE_WINDOW_SET_BUFFERS_FORMAT: res = dispatchSetBuffersFormat(args); break; @@ -380,6 +387,12 @@ int SurfaceTextureClient::dispatchSetBuffersDimensions(va_list args) { return setBuffersDimensions(w, h); } +int SurfaceTextureClient::dispatchSetBuffersUserDimensions(va_list args) { + int w = va_arg(args, int); + int h = va_arg(args, int); + return setBuffersUserDimensions(w, h); +} + int SurfaceTextureClient::dispatchSetBuffersFormat(va_list args) { int f = va_arg(args, int); return setBuffersFormat(f); @@ -504,6 +517,24 @@ int SurfaceTextureClient::setBuffersDimensions(int w, int h) return NO_ERROR; } +int SurfaceTextureClient::setBuffersUserDimensions(int w, int h) +{ + ATRACE_CALL(); + ALOGV("SurfaceTextureClient::setBuffersUserDimensions"); + + if (w<0 || h<0) + return BAD_VALUE; + + if ((w && !h) || (!w && h)) + return BAD_VALUE; + + Mutex::Autolock lock(mMutex); + mUserWidth = w; + mUserHeight = h; + mCrop.clear(); + return NO_ERROR; +} + int SurfaceTextureClient::setBuffersFormat(int format) { ALOGV("SurfaceTextureClient::setBuffersFormat"); |