virtual int setBuffersTransform(int transform);
virtual int setBuffersTimestamp(int64_t timestamp);
virtual int setCrop(Rect const* rect);
- virtual int setPostTransformCrop(Rect const* rect);
virtual int setUsage(uint32_t reqUsage);
virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds);
virtual int unlockAndPost();
// that gets queued. It is set by calling setCrop.
Rect mCrop;
- // mCropNeedsTransform indicates whether mCrop is in post-transform
- // coordinates and must be transformed using the inverse of mTransform
- // before being queued with a buffer. Otherwise the crop is passed
- // untransformed. It is initialized to false, is set to true by
- // setPostTransformCrop, and set to false by setCrop.
- bool mCropNeedsTransform;
-
// mScalingMode is the scaling mode that will be used for the next
// buffers that get queued. It is set by calling setScalingMode.
int mScalingMode;
// synchronizing access to it. It's too late at this point to abort the
// dequeue operation.
if (result == EGL_FALSE) {
- ALOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
+ ST_LOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
} else if (result == EGL_TIMEOUT_EXPIRED_KHR) {
- ALOGE("dequeueBuffer: timeout waiting for fence");
+ ST_LOGE("dequeueBuffer: timeout waiting for fence");
}
eglDestroySyncKHR(dpy, fence);
}
mReqUsage = 0;
mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO;
mCrop.clear();
- mCropNeedsTransform = false;
mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
mTransform = 0;
mDefaultWidth = 0;
return i;
}
- Rect crop(mCrop);
- if (mCropNeedsTransform) {
- // The crop rect was specified in the post-transform coordinate space,
- // so we need to transform that rect by the inverse of mTransform to
- // put it into the buffer pixel space before queuing it.
- uint32_t invTransform = mTransform;
- int32_t width = buffer->width;
- int32_t height = buffer->height;
- if (mTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
- invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
- NATIVE_WINDOW_TRANSFORM_FLIP_H;
- width = buffer->height;
- height = buffer->width;
- }
- crop = mCrop.transform(invTransform, width, height);
- }
-
// Make sure the crop rectangle is entirely inside the buffer.
- crop.intersect(Rect(buffer->width, buffer->height), &crop);
+ Rect crop;
+ mCrop.intersect(Rect(buffer->width, buffer->height), &crop);
ISurfaceTexture::QueueBufferOutput output;
ISurfaceTexture::QueueBufferInput input(timestamp, crop, mScalingMode,
case NATIVE_WINDOW_SET_CROP:
res = dispatchSetCrop(args);
break;
- case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP:
- res = dispatchSetPostTransformCrop(args);
- break;
case NATIVE_WINDOW_SET_BUFFER_COUNT:
res = dispatchSetBufferCount(args);
break;
return setCrop(reinterpret_cast<Rect const*>(rect));
}
-int SurfaceTextureClient::dispatchSetPostTransformCrop(va_list args) {
- android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
- return setPostTransformCrop(reinterpret_cast<Rect const*>(rect));
-}
-
int SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
size_t bufferCount = va_arg(args, size_t);
return setBufferCount(bufferCount);
mReqHeight = 0;
mReqUsage = 0;
mCrop.clear();
- mCropNeedsTransform = false;
mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
mTransform = 0;
if (api == NATIVE_WINDOW_API_CPU) {
Mutex::Autolock lock(mMutex);
mCrop = realRect;
- mCropNeedsTransform = false;
- return NO_ERROR;
-}
-
-int SurfaceTextureClient::setPostTransformCrop(Rect const* rect)
-{
- ATRACE_CALL();
-
- Rect realRect;
- if (rect == NULL || rect->isEmpty()) {
- realRect.clear();
- } else {
- realRect = *rect;
- }
-
- ALOGV("SurfaceTextureClient::setPostTransformCrop rect=[%d %d %d %d]",
- realRect.left, realRect.top, realRect.right, realRect.bottom);
-
- Mutex::Autolock lock(mMutex);
- mCrop = realRect;
- mCropNeedsTransform = true;
return NO_ERROR;
}
ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
}
-TEST_F(SurfaceTextureClientTest, SetPostTransformCropUntransforms) {
- android_native_rect_t rect = {1, 5, 4, 14};
- native_window_set_post_transform_crop(mANW.get(), &rect);
-
- uint32_t xforms[] = {
- HAL_TRANSFORM_FLIP_H,
- HAL_TRANSFORM_FLIP_V,
- HAL_TRANSFORM_ROT_90,
- HAL_TRANSFORM_ROT_180,
- HAL_TRANSFORM_ROT_270,
- };
-
- Rect expectedRects[] = {
- Rect(4, 5, 7, 14), // HAL_TRANSFORM_FLIP_H
- Rect(1, 2, 4, 11), // HAL_TRANSFORM_FLIP_V
- Rect(5, 4, 14, 7), // HAL_TRANSFORM_ROT_90
- Rect(4, 2, 7, 11), // HAL_TRANSFORM_ROT_180
- Rect(2, 1, 11, 4), // HAL_TRANSFORM_ROT_270
- };
-
- for (size_t i = 0; i < sizeof(xforms)/sizeof(xforms[0]); i++) {
- SCOPED_TRACE(String8::format("xform=%#x", xforms[i]).string());
-
- int w = 8, h = 16;
- if (xforms[i] & HAL_TRANSFORM_ROT_90) {
- w = 16;
- h = 8;
- }
- ASSERT_EQ(OK, native_window_set_buffers_transform(mANW.get(), xforms[i]));
- ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), w, h));
-
- android_native_buffer_t* buf;
- ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
- ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf));
- ASSERT_EQ(OK, mST->updateTexImage());
-
- Rect crop = mST->getCurrentCrop();
- EXPECT_EQ(expectedRects[i].left, crop.left);
- EXPECT_EQ(expectedRects[i].top, crop.top);
- EXPECT_EQ(expectedRects[i].right, crop.right);
- EXPECT_EQ(expectedRects[i].bottom, crop.bottom);
- }
-}
-
TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
android_native_rect_t rect = {-2, -13, 40, 18};
native_window_set_crop(mANW.get(), &rect);