diff options
author | John Reck <jreck@google.com> | 2016-04-29 14:49:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-04-29 14:49:21 +0000 |
commit | 6d42b5c6e399a10799d2bba3f7113dd198cbcae6 (patch) | |
tree | d003e4cc33b4114b5bc8ff7b0c7a3118cf8a2431 | |
parent | a1c06675dd2a83ce445f27b46cddab80f8c743e6 (diff) | |
parent | 2f69d6d4fdd4994912e5515016421625d1e1c4ec (diff) |
Merge "Support transform'd GraphicBuffers" into nyc-dev
-rw-r--r-- | libs/hwui/GlopBuilder.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/GlopBuilder.h | 2 | ||||
-rw-r--r-- | libs/hwui/Matrix.h | 2 | ||||
-rw-r--r-- | libs/hwui/Readback.cpp | 9 | ||||
-rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/GetBitmapSurfaceViewActivity.java | 34 |
5 files changed, 46 insertions, 6 deletions
diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp index fdbe76a5e459..0a8e3f3b4db3 100644 --- a/libs/hwui/GlopBuilder.cpp +++ b/libs/hwui/GlopBuilder.cpp @@ -471,18 +471,19 @@ GlopBuilder& GlopBuilder::setFillTextureLayer(Layer& layer, float alpha) { return *this; } -GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture) { +GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& textureTransform) { TRIGGER_STAGE(kFillStage); REQUIRE_STAGES(kMeshStage | kRoundRectClipStage); mOutGlop->fill.texture = { &texture, GL_TEXTURE_EXTERNAL_OES, GL_LINEAR, GL_CLAMP_TO_EDGE, - nullptr }; + &textureTransform }; setFill(SK_ColorWHITE, 1.0f, SkXfermode::kSrc_Mode, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr); mDescription.modulate = mOutGlop->fill.color.a < 1.0f; + mDescription.hasTextureTransform = true; return *this; } diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h index b6c186d85e76..a9dd56f385b1 100644 --- a/libs/hwui/GlopBuilder.h +++ b/libs/hwui/GlopBuilder.h @@ -73,7 +73,7 @@ public: // TODO: Texture should probably know and own its target. // setFillLayer() forces it to GL_TEXTURE which isn't always correct. // Similarly setFillLayer normally forces its own wrap & filter mode - GlopBuilder& setFillExternalTexture(Texture& texture); + GlopBuilder& setFillExternalTexture(Texture& texture, Matrix4& textureTransform); GlopBuilder& setTransform(const Snapshot& snapshot, const int transformFlags) { return setTransform(*snapshot.transform, transformFlags); diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h index 36007cd5dc0e..9cde5d6aa04e 100644 --- a/libs/hwui/Matrix.h +++ b/libs/hwui/Matrix.h @@ -236,6 +236,8 @@ public: static const Matrix4& identity(); + void invalidateType() { mType = kTypeUnknown; } + private: mutable uint8_t mType; diff --git a/libs/hwui/Readback.cpp b/libs/hwui/Readback.cpp index 49596e143ebf..55f823dfe226 100644 --- a/libs/hwui/Readback.cpp +++ b/libs/hwui/Readback.cpp @@ -101,7 +101,10 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, // Setup the source sp<GraphicBuffer> sourceBuffer; sp<Fence> sourceFence; - status_t err = surface.getLastQueuedBuffer(&sourceBuffer, &sourceFence); + Matrix4 texTransform; + status_t err = surface.getLastQueuedBuffer(&sourceBuffer, &sourceFence, + texTransform.data); + texTransform.invalidateType(); if (err != NO_ERROR) { ALOGW("Failed to get last queued buffer, error = %d", err); return CopyResult::UnknownError; @@ -163,8 +166,8 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, Glop glop; GlopBuilder(renderState, caches, &glop) .setRoundRectClipState(nullptr) - .setMeshTexturedUvQuad(nullptr, Rect(0, 1, 1, 0)) // TODO: simplify with VBO - .setFillExternalTexture(sourceTexture) + .setMeshTexturedUnitQuad(nullptr) + .setFillExternalTexture(sourceTexture, texTransform) .setTransform(Matrix4::identity(), TransformFlags::None) .setModelViewMapUnitToRect(destRect) .build(); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/GetBitmapSurfaceViewActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/GetBitmapSurfaceViewActivity.java index f658b7c05e66..6fe2cb472a97 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/GetBitmapSurfaceViewActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/GetBitmapSurfaceViewActivity.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.Environment; import android.view.Gravity; import android.view.PixelCopy; +import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; @@ -87,9 +88,42 @@ public class GetBitmapSurfaceViewActivity extends Activity implements SurfaceHol android.util.Log.e("TextureView", "Cannot set preview texture target!", t); } + setCameraDisplayOrientation(this, 0, mCamera); mCamera.startPreview(); } + public static void setCameraDisplayOrientation(Activity activity, + int cameraId, android.hardware.Camera camera) { + android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); + android.hardware.Camera.getCameraInfo(cameraId, info); + int rotation = activity.getWindowManager().getDefaultDisplay() + .getRotation(); + int degrees = 0; + switch (rotation) { + case Surface.ROTATION_0: + degrees = 0; + break; + case Surface.ROTATION_90: + degrees = 90; + break; + case Surface.ROTATION_180: + degrees = 180; + break; + case Surface.ROTATION_270: + degrees = 270; + break; + } + + int result; + if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { + result = (info.orientation + degrees) % 360; + result = (360 - result) % 360; // compensate the mirror + } else { // back-facing + result = (info.orientation - degrees + 360) % 360; + } + camera.setDisplayOrientation(result); + } + @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } |