diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 5d3bd1a..36a81a6 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -76,7 +76,6 @@
     mReqUsage = 0;
     mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO;
     mCrop.clear();
-    mCropNeedsTransform = false;
     mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
     mTransform = 0;
     mDefaultWidth = 0;
@@ -238,25 +237,9 @@
         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,
@@ -341,9 +324,6 @@
     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;
@@ -407,11 +387,6 @@
     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);
@@ -501,7 +476,6 @@
         mReqHeight = 0;
         mReqUsage = 0;
         mCrop.clear();
-        mCropNeedsTransform = false;
         mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
         mTransform = 0;
         if (api == NATIVE_WINDOW_API_CPU) {
@@ -535,27 +509,6 @@
 
     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;
 }
 
