OSDN Git Service

Use NEAREST filtering mode for TextureView.getBitmap().
authorRomain Guy <romainguy@google.com>
Fri, 8 Jul 2011 04:05:04 +0000 (21:05 -0700)
committerRomain Guy <romainguy@google.com>
Fri, 8 Jul 2011 04:27:14 +0000 (21:27 -0700)
Change-Id: I4649062bbdf18ebba7924bdf578f39ad8f6576ac

libs/hwui/LayerRenderer.cpp
libs/hwui/OpenGLRenderer.cpp
tests/HwAccelerationTest/src/com/android/test/hwui/GLTextureViewActivity.java
tests/HwAccelerationTest/src/com/android/test/hwui/TextureViewActivity.java

index 44f2a40..1fa343b 100644 (file)
@@ -368,8 +368,8 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) {
         glActiveTexture(GL_TEXTURE0);
         glBindTexture(GL_TEXTURE_2D, texture);
 
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
index cb5a82b..06e3b29 100644 (file)
@@ -645,7 +645,9 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) {
     } else {
         setupDrawExternalTexture(layer->getTexture());
     }
-    if (mSnapshot->transform->isPureTranslate()) {
+    if (mSnapshot->transform->isPureTranslate() &&
+            layer->getWidth() == (uint32_t) rect.getWidth() &&
+            layer->getHeight() == (uint32_t) rect.getHeight()) {
         const float x = (int) floorf(rect.left + mSnapshot->transform->getTranslateX() + 0.5f);
         const float y = (int) floorf(rect.top + mSnapshot->transform->getTranslateY() + 0.5f);
 
@@ -673,7 +675,9 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap)
         float y = rect.top;
         bool simpleTransform = mSnapshot->transform->isPureTranslate();
 
-        if (simpleTransform) {
+        if (simpleTransform &&
+                layer->getWidth() == (uint32_t) rect.getWidth() &&
+                layer->getHeight() == (uint32_t) rect.getHeight()) {
             // When we're swapping, the layer is already in screen coordinates
             if (!swap) {
                 x = (int) floorf(rect.left + mSnapshot->transform->getTranslateX() + 0.5f);
index e1ca756..f471f3e 100644 (file)
@@ -16,6 +16,8 @@
 
 package com.android.test.hwui;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
 import android.app.Activity;
@@ -40,6 +42,10 @@ import javax.microedition.khronos.egl.EGLDisplay;
 import javax.microedition.khronos.egl.EGLSurface;
 import javax.microedition.khronos.opengles.GL;
 
+import java.io.BufferedOutputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
@@ -57,6 +63,25 @@ public class GLTextureViewActivity extends Activity implements TextureView.Surfa
 
         mTextureView = new TextureView(this);
         mTextureView.setSurfaceTextureListener(this);
+        mTextureView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Bitmap b = mTextureView.getBitmap(600, 350);
+                BufferedOutputStream out = null;
+                try {
+                    out = new BufferedOutputStream(new FileOutputStream("/sdcard/out.png"));
+                    b.compress(Bitmap.CompressFormat.PNG, 100, out);
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                } finally {
+                    if (out != null) try {
+                        out.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
 
         setContentView(mTextureView, new FrameLayout.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -77,7 +102,7 @@ public class GLTextureViewActivity extends Activity implements TextureView.Surfa
         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
-                ((View) mTextureView.getParent()).invalidate();
+                mTextureView.invalidate();
             }
         });
         animator.start();
index 95b84c4..634e7e3 100644 (file)
@@ -16,7 +16,6 @@
 
 package com.android.test.hwui;
 
-import android.animation.AnimatorSet;
 import android.app.Activity;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
@@ -34,7 +33,6 @@ public class TextureViewActivity extends Activity implements TextureView.Surface
     private Camera mCamera;
     private TextureView mTextureView;
     private FrameLayout mContent;
-    private AnimatorSet mAnimatorSet;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -53,7 +51,6 @@ public class TextureViewActivity extends Activity implements TextureView.Surface
             @Override
             public void onClick(View v) {
                 if (mAdded) {
-                    if (mAnimatorSet != null) mAnimatorSet.cancel();
                     mContent.removeView(mTextureView);
                 } else {
                     mContent.addView(mTextureView);