summaryrefslogtreecommitdiff
path: root/libs/gui/SurfaceTextureClient.cpp
diff options
context:
space:
mode:
author Michael I. Gold <gold@nvidia.com> 2012-04-09 19:46:29 -0700
committer Jamie Gennis <jgennis@google.com> 2012-04-11 18:37:54 -0700
commit55a701459de964ae3504264a6b8c4dc37f54a9e8 (patch)
tree077b6c5ec8d57f8986146fa55662f485eaf31d17 /libs/gui/SurfaceTextureClient.cpp
parent562f4b2c1e555b853997113bb54b21303d642bc6 (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.cpp37
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");