diff options
Diffstat (limited to 'jni')
-rw-r--r--[-rwxr-xr-x] | jni/feature_mos/src/mosaic_renderer/Renderer.cpp | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | jni/feature_mos/src/mosaic_renderer/Renderer.h | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | jni/feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | jni/feature_mos/src/mosaic_renderer/WarpRenderer.cpp | 52 | ||||
-rwxr-xr-x | jni/feature_mos/src/mosaic_renderer/WarpRenderer.h | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp | 2 | ||||
-rw-r--r-- | jni/mosaic_renderer_jni.cpp | 230 |
7 files changed, 214 insertions, 90 deletions
diff --git a/jni/feature_mos/src/mosaic_renderer/Renderer.cpp b/jni/feature_mos/src/mosaic_renderer/Renderer.cpp index b9938eb6b..8d0632402 100755..100644 --- a/jni/feature_mos/src/mosaic_renderer/Renderer.cpp +++ b/jni/feature_mos/src/mosaic_renderer/Renderer.cpp @@ -111,8 +111,8 @@ GLuint Renderer::createProgram(const char* pVertexSource, const char* pFragmentS } // Set this renderer to use the default frame-buffer (screen) and -// set the viewport size to be the given width and height (pixels). -bool Renderer::SetupGraphics(int width, int height) +// set the viewport size to be the given x, y, width and height (pixels). +bool Renderer::SetupGraphics(int x, int y, int width, int height) { bool succeeded = false; do { @@ -131,8 +131,10 @@ bool Renderer::SetupGraphics(int width, int height) mFrameBuffer = NULL; mSurfaceWidth = width; mSurfaceHeight = height; + mSurfaceXOffset = x; + mSurfaceYOffset = y; - glViewport(0, 0, mSurfaceWidth, mSurfaceHeight); + glViewport(mSurfaceXOffset, mSurfaceYOffset, mSurfaceWidth, mSurfaceHeight); if (!checkGlError("glViewport")) break; succeeded = true; } while (false); @@ -176,7 +178,7 @@ bool Renderer::Clear(float r, float g, float b, float a) bool succeeded = false; do { bool rt = (mFrameBuffer == NULL)? - SetupGraphics(mSurfaceWidth, mSurfaceHeight) : + SetupGraphics(mSurfaceXOffset, mSurfaceYOffset, mSurfaceWidth, mSurfaceHeight) : SetupGraphics(mFrameBuffer); if(!rt) diff --git a/jni/feature_mos/src/mosaic_renderer/Renderer.h b/jni/feature_mos/src/mosaic_renderer/Renderer.h index a43e8028e..ffb9cbd25 100755..100644 --- a/jni/feature_mos/src/mosaic_renderer/Renderer.h +++ b/jni/feature_mos/src/mosaic_renderer/Renderer.h @@ -18,7 +18,7 @@ class Renderer { virtual bool InitializeGLProgram() = 0; bool SetupGraphics(FrameBuffer* buffer); - bool SetupGraphics(int width, int height); + bool SetupGraphics(int x, int y, int width, int height); bool Clear(float r, float g, float b, float a); @@ -59,6 +59,8 @@ class Renderer { int mSurfaceWidth; // Width of target surface. int mSurfaceHeight; // Height of target surface. + int mSurfaceXOffset; // X Offset target surface. + int mSurfaceYOffset; // Y Offset of target surface. FrameBuffer *mFrameBuffer; }; diff --git a/jni/feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp b/jni/feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp index 88aac3626..4725463f2 100755..100644 --- a/jni/feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp +++ b/jni/feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp @@ -119,7 +119,7 @@ bool SurfaceTextureRenderer::DrawTexture(GLfloat *affine) bool succeeded = false; do { bool rt = (mFrameBuffer == NULL)? - SetupGraphics(mSurfaceWidth, mSurfaceHeight) : + SetupGraphics(mSurfaceXOffset, mSurfaceYOffset, mSurfaceWidth, mSurfaceHeight) : SetupGraphics(mFrameBuffer); if(!rt) diff --git a/jni/feature_mos/src/mosaic_renderer/WarpRenderer.cpp b/jni/feature_mos/src/mosaic_renderer/WarpRenderer.cpp index af6779a3f..e4755b1ed 100755..100644 --- a/jni/feature_mos/src/mosaic_renderer/WarpRenderer.cpp +++ b/jni/feature_mos/src/mosaic_renderer/WarpRenderer.cpp @@ -68,6 +68,51 @@ void WarpRenderer::SetScalingMatrix(float xscale, float yscale) mScalingMatrix[15] = 1.0f; } +void WarpRenderer::SetRotation(int degree) +{ + for(int i=0; i<16; i++) + { + mRotationMatrix[i] = 0.0f; + } + + switch(degree) + { + case 0: + mRotationMatrix[0] = 1.0f; + mRotationMatrix[1] = 0.0f; + mRotationMatrix[4] = 0.0f; + mRotationMatrix[5] = 1.0f; + break; + case 90: + mRotationMatrix[0] = 0.0f; + mRotationMatrix[1] = 1.0f; + mRotationMatrix[4] = -1.0f; + mRotationMatrix[5] = 0.0f; + break; + case 180: + mRotationMatrix[0] = -1.0f; + mRotationMatrix[1] = 0.0f; + mRotationMatrix[4] = 0.0f; + mRotationMatrix[5] = -1.0f; + break; + case 270: + mRotationMatrix[0] = 0.0f; + mRotationMatrix[1] = -1.0f; + mRotationMatrix[4] = 1.0f; + mRotationMatrix[5] = 0.0f; + break; + default: + mRotationMatrix[0] = 1.0f; + mRotationMatrix[1] = 0.0f; + mRotationMatrix[4] = 0.0f; + mRotationMatrix[5] = 1.0f; + break; + } + + mRotationMatrix[10] = 1.0f; + mRotationMatrix[15] = 1.0f; +} + bool WarpRenderer::InitializeGLProgram() { bool succeeded = false; @@ -87,6 +132,7 @@ bool WarpRenderer::InitializeGLProgram() mAffinetransLoc = glGetUniformLocation(glProgram, "u_affinetrans"); mViewporttransLoc = glGetUniformLocation(glProgram, "u_viewporttrans"); mScalingtransLoc = glGetUniformLocation(glProgram, "u_scalingtrans"); + mRotationtransLoc = glGetUniformLocation(glProgram, "u_rotationtrans"); mTexCoordLoc = glGetAttribLocation(glProgram, "a_texCoord"); // Get sampler location @@ -110,7 +156,7 @@ bool WarpRenderer::DrawTexture(GLfloat *affine) bool succeeded = false; do { bool rt = (mFrameBuffer == NULL)? - SetupGraphics(mSurfaceWidth, mSurfaceHeight) : + SetupGraphics(mSurfaceXOffset, mSurfaceYOffset, mSurfaceWidth, mSurfaceHeight) : SetupGraphics(mFrameBuffer); if(!rt) @@ -143,6 +189,7 @@ bool WarpRenderer::DrawTexture(GLfloat *affine) glUniformMatrix4fv(mAffinetransLoc, 1, GL_FALSE, affine); glUniformMatrix4fv(mViewporttransLoc, 1, GL_FALSE, mViewportMatrix); glUniformMatrix4fv(mScalingtransLoc, 1, GL_FALSE, mScalingMatrix); + glUniformMatrix4fv(mRotationtransLoc, 1, GL_FALSE, mRotationMatrix); // And, finally, execute the GL draw command. glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, g_iIndices); @@ -161,12 +208,13 @@ const char* WarpRenderer::VertexShaderSource() const "uniform mat4 u_affinetrans; \n" "uniform mat4 u_viewporttrans; \n" "uniform mat4 u_scalingtrans; \n" + "uniform mat4 u_rotationtrans; \n" "attribute vec4 a_position; \n" "attribute vec2 a_texCoord; \n" "varying vec2 v_texCoord; \n" "void main() \n" "{ \n" - " gl_Position = u_scalingtrans * u_viewporttrans * u_affinetrans * a_position; \n" + " gl_Position = u_scalingtrans * u_viewporttrans * u_affinetrans * u_rotationtrans * a_position; \n" " v_texCoord = a_texCoord; \n" "} \n"; diff --git a/jni/feature_mos/src/mosaic_renderer/WarpRenderer.h b/jni/feature_mos/src/mosaic_renderer/WarpRenderer.h index 8e9a694ec..2f50c6f34 100755 --- a/jni/feature_mos/src/mosaic_renderer/WarpRenderer.h +++ b/jni/feature_mos/src/mosaic_renderer/WarpRenderer.h @@ -20,7 +20,7 @@ class WarpRenderer: public Renderer { void SetViewportMatrix(int w, int h, int W, int H); void SetScalingMatrix(float xscale, float yscale); - + void SetRotation(int degree); bool DrawTexture(GLfloat *affine); private: @@ -38,9 +38,11 @@ class WarpRenderer: public Renderer { GLint mViewporttransLoc; GLint mScalingtransLoc; GLint mTexCoordLoc; + GLint mRotationtransLoc; GLfloat mViewportMatrix[16]; GLfloat mScalingMatrix[16]; + GLfloat mRotationMatrix[16]; // Sampler location GLint mSamplerLoc; diff --git a/jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp b/jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp index f7dcf6f61..b30e6f7b6 100755..100644 --- a/jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp +++ b/jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp @@ -79,7 +79,7 @@ bool YVURenderer::DrawTexture() bool succeeded = false; do { bool rt = (mFrameBuffer == NULL)? - SetupGraphics(mSurfaceWidth, mSurfaceHeight) : + SetupGraphics(mSurfaceXOffset, mSurfaceYOffset, mSurfaceWidth, mSurfaceHeight) : SetupGraphics(mFrameBuffer); if(!rt) diff --git a/jni/mosaic_renderer_jni.cpp b/jni/mosaic_renderer_jni.cpp index 36f8064c7..6c52b542e 100644 --- a/jni/mosaic_renderer_jni.cpp +++ b/jni/mosaic_renderer_jni.cpp @@ -36,6 +36,8 @@ GLuint gSurfaceTextureID[1]; bool gWarpImage = true; +bool gPreviewBackgroundImage = true; +bool gEnableWarpedPanoPreview = false; // Low-Res input image frame in YUVA format for preview rendering and processing // and high-res YUVA input image for processing. @@ -87,6 +89,9 @@ FrameBuffer gBuffer[2]; // Shader to warp and render the preview FBO to the screen WarpRenderer gPreview; +// Shader to render the fullscreen preview background FBO to the screen +WarpRenderer gPreviewBackground; + // Index of the gBuffer FBO gWarper1 is going to write into int gCurrentFBOIndex = 0; @@ -122,6 +127,9 @@ double gUILayoutScalingY = 1.0f; // orientation. bool gIsLandscapeOrientation = true; +// Current device orientation +int gOrientation = 0; + // State of the viewfinder. Set to false when the viewfinder hits the UI edge. bool gPanViewfinder = true; @@ -315,8 +323,8 @@ void UpdateWarpTransformation(float *trs) // Alignment is done based on low-res data. // To render the preview mosaic, the translation of the high-res mosaic is estimated to // H2L_FACTOR x low-res-based tranlation. - gThisH1t[2] *= H2L_FACTOR; - gThisH1t[5] *= H2L_FACTOR; + //gThisH1t[2] *= H2L_FACTOR; + //gThisH1t[5] *= H2L_FACTOR; db_Identity3x3(T); T[2] = -gCenterOffsetX; @@ -397,13 +405,13 @@ void AllocateTextureMemory(int widthHR, int heightHR, int widthLR, int heightLR) gPreviewImageHeight[HR], 4); sem_post(&gPreviewImage_semaphore); - gPreviewFBOWidth = PREVIEW_FBO_WIDTH_SCALE * gPreviewImageWidth[HR]; - gPreviewFBOHeight = PREVIEW_FBO_HEIGHT_SCALE * gPreviewImageHeight[HR]; + gPreviewFBOWidth = PREVIEW_FBO_WIDTH_SCALE * gPreviewImageWidth[LR]; + gPreviewFBOHeight = PREVIEW_FBO_HEIGHT_SCALE * gPreviewImageHeight[LR]; // The origin is such that the current frame will sit with its center // at the center of the previewFBO - gCenterOffsetX = (gPreviewFBOWidth / 2 - gPreviewImageWidth[HR] / 2); - gCenterOffsetY = (gPreviewFBOHeight / 2 - gPreviewImageHeight[HR] / 2); + gCenterOffsetX = (gPreviewFBOWidth / 2 - gPreviewImageWidth[LR] / 2); + gCenterOffsetY = (gPreviewFBOHeight / 2 - gPreviewImageHeight[LR] / 2); gPanOffset = 0.0f; @@ -412,8 +420,8 @@ void AllocateTextureMemory(int widthHR, int heightHR, int widthLR, int heightLR) gPanViewfinder = true; - int w = gPreviewImageWidth[HR]; - int h = gPreviewImageHeight[HR]; + int w = gPreviewImageWidth[LR]; + int h = gPreviewImageHeight[LR]; int wm = gPreviewFBOWidth; int hm = gPreviewFBOHeight; @@ -479,10 +487,10 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved); JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved); JNIEXPORT jint JNICALL Java_com_android_camera_MosaicRenderer_init( - JNIEnv * env, jobject obj); + JNIEnv * env, jobject obj, jboolean mEnableWarpedPanoPreview); JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_reset( JNIEnv * env, jobject obj, jint width, jint height, - jboolean isLandscapeOrientation); + jboolean isLandscapeOrientation, jint orientation); JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_preprocess( JNIEnv * env, jobject obj, jfloatArray stMatrix); JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_transferGPUtoCPU( @@ -493,6 +501,8 @@ extern "C" JNIEnv * env, jobject obj); JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_setWarping( JNIEnv * env, jobject obj, jboolean flag); + JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_setPreviewBackground( + JNIEnv * env, jobject obj, jboolean flag); }; @@ -509,21 +519,25 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) sem_destroy(&gPreviewImage_semaphore); } JNIEXPORT jint JNICALL Java_com_android_camera_MosaicRenderer_init( - JNIEnv * env, jobject obj) + JNIEnv * env, jobject obj, jboolean mEnableWarpedPanoPreview) { + gEnableWarpedPanoPreview = mEnableWarpedPanoPreview; gSurfTexRenderer[LR].InitializeGLProgram(); gSurfTexRenderer[HR].InitializeGLProgram(); gYVURenderer[LR].InitializeGLProgram(); gYVURenderer[HR].InitializeGLProgram(); - gWarper1.InitializeGLProgram(); - gWarper2.InitializeGLProgram(); - gPreview.InitializeGLProgram(); - gBuffer[0].InitializeGLContext(); - gBuffer[1].InitializeGLContext(); + if (gEnableWarpedPanoPreview) { + gWarper1.InitializeGLProgram(); + gWarper2.InitializeGLProgram(); + gPreview.InitializeGLProgram(); + gBuffer[0].InitializeGLContext(); + gBuffer[1].InitializeGLContext(); + } gBufferInput[LR].InitializeGLContext(); gBufferInput[HR].InitializeGLContext(); gBufferInputYVU[LR].InitializeGLContext(); gBufferInputYVU[HR].InitializeGLContext(); + gPreviewBackground.InitializeGLProgram(); glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -579,13 +593,17 @@ void calculateUILayoutScaling(int width, int height, bool isLandscape) { } JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_reset( - JNIEnv * env, jobject obj, jint width, jint height, jboolean isLandscapeOrientation) + JNIEnv * env, jobject obj, jint width, jint height, + jboolean isLandscapeOrientation, jint orientation) { gIsLandscapeOrientation = isLandscapeOrientation; - calculateUILayoutScaling(width, height, gIsLandscapeOrientation); + gOrientation = orientation; + calculateUILayoutScaling(gPreviewFBOWidth, gPreviewFBOHeight, gIsLandscapeOrientation); - gBuffer[0].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); - gBuffer[1].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); + if (gEnableWarpedPanoPreview) { + gBuffer[0].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); + gBuffer[1].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); + } gBufferInput[LR].Init(gPreviewImageWidth[LR], gPreviewImageHeight[LR], GL_RGBA); @@ -626,37 +644,76 @@ JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_reset( gYVURenderer[HR].SetInputTextureName(gBufferInput[HR].GetTextureName()); gYVURenderer[HR].SetInputTextureType(GL_TEXTURE_2D); - // gBuffer[1-gCurrentFBOIndex] --> gWarper1 --> gBuffer[gCurrentFBOIndex] - gWarper1.SetupGraphics(&gBuffer[gCurrentFBOIndex]); - - // Clear the destination buffer of gWarper1. - gWarper1.Clear(0.0, 0.0, 0.0, 1.0); - gWarper1.SetViewportMatrix(1, 1, 1, 1); - gWarper1.SetScalingMatrix(1.0f, 1.0f); - gWarper1.SetInputTextureName(gBuffer[1 - gCurrentFBOIndex].GetTextureName()); - gWarper1.SetInputTextureType(GL_TEXTURE_2D); - - // gBufferInput[HR] --> gWarper2 --> gBuffer[gCurrentFBOIndex] - gWarper2.SetupGraphics(&gBuffer[gCurrentFBOIndex]); - - // gWarp2's destination buffer is the same to gWarp1's. No need to clear it - // again. - gWarper2.SetViewportMatrix(gPreviewImageWidth[HR], - gPreviewImageHeight[HR], gBuffer[gCurrentFBOIndex].GetWidth(), - gBuffer[gCurrentFBOIndex].GetHeight()); - gWarper2.SetScalingMatrix(1.0f, 1.0f); - gWarper2.SetInputTextureName(gBufferInput[HR].GetTextureName()); - gWarper2.SetInputTextureType(GL_TEXTURE_2D); - - // gBuffer[gCurrentFBOIndex] --> gPreview --> Screen - gPreview.SetupGraphics(width, height); - gPreview.SetViewportMatrix(1, 1, 1, 1); - - // Scale the previewFBO so that the viewfinder window fills the layout height - // while maintaining the image aspect ratio - gPreview.SetScalingMatrix(gUILayoutScalingX, -1.0f * gUILayoutScalingY); - gPreview.SetInputTextureName(gBuffer[gCurrentFBOIndex].GetTextureName()); - gPreview.SetInputTextureType(GL_TEXTURE_2D); + if(gEnableWarpedPanoPreview) { + // gBuffer[1-gCurrentFBOIndex] --> gWarper1 --> gBuffer[gCurrentFBOIndex] + gWarper1.SetupGraphics(&gBuffer[gCurrentFBOIndex]); + + // Clear the destination buffer of gWarper1. + gWarper1.Clear(0.0, 0.0, 0.0, 1.0); + gWarper1.SetViewportMatrix(1, 1, 1, 1); + gWarper1.SetScalingMatrix(1.0f, 1.0f); + gWarper1.SetRotation(0); + gWarper1.SetInputTextureName(gBuffer[1 - gCurrentFBOIndex].GetTextureName()); + gWarper1.SetInputTextureType(GL_TEXTURE_2D); + + // gBufferInput[LR] --> gWarper2 --> gBuffer[gCurrentFBOIndex] + gWarper2.SetupGraphics(&gBuffer[gCurrentFBOIndex]); + + // gWarp2's destination buffer is the same to gWarp1's. No need to clear it + // again. + gWarper2.SetViewportMatrix(gPreviewImageWidth[LR], + gPreviewImageHeight[LR], gBuffer[gCurrentFBOIndex].GetWidth(), + gBuffer[gCurrentFBOIndex].GetHeight()); + gWarper2.SetScalingMatrix(1.0f, 1.0f); + gWarper2.SetRotation(0); + gWarper2.SetInputTextureName(gBufferInput[LR].GetTextureName()); + gWarper2.SetInputTextureType(GL_TEXTURE_2D); + + int xoffset = (width / 2 - gPreviewFBOWidth / 2); + int yoffset = (height / 2 - gPreviewFBOHeight / 2); + if (gOrientation == 0) { + yoffset = (height - gPreviewFBOHeight) * 1 / 5; + } else { + yoffset = (height - gPreviewFBOHeight) * 4 / 5; + } + + // gBuffer[gCurrentFBOIndex] --> gPreview --> Screen + if(!gIsLandscapeOrientation) { + gPreview.SetupGraphics(xoffset,yoffset,gPreviewFBOWidth, gPreviewFBOHeight); + } else { + yoffset = (height / 2 - gPreviewFBOWidth / 2); + if (gOrientation == 90) { + xoffset = (width - gPreviewFBOHeight) * 4 / 5; + } else { + xoffset = (width - gPreviewFBOHeight) * 1 / 5; + } + gPreview.SetupGraphics(xoffset,yoffset,gPreviewFBOHeight ,gPreviewFBOWidth); + } + gPreview.SetViewportMatrix(1, 1, 1, 1); + + // Scale the previewFBO so that the viewfinder window fills the layout height + // while maintaining the image aspect ratio + gPreview.SetScalingMatrix(gUILayoutScalingX, -1.0f * gUILayoutScalingY); + gPreview.SetInputTextureName(gBuffer[gCurrentFBOIndex].GetTextureName()); + gPreview.SetInputTextureType(GL_TEXTURE_2D); + if (gIsLandscapeOrientation) { + gPreview.SetRotation(90); + } else { + gPreview.SetRotation(0); + } + } + + // gBufferInput[HR] --> gPreviewBackground --> screen + gPreviewBackground.SetupGraphics(0,0,width, height); + gPreviewBackground.SetViewportMatrix(1,1,1,1); + gPreviewBackground.SetScalingMatrix(1.0f, -1.0f); + gPreviewBackground.SetInputTextureName(gBufferInput[HR].GetTextureName()); + gPreviewBackground.SetInputTextureType(GL_TEXTURE_2D); + if (gIsLandscapeOrientation) { + gPreviewBackground.SetRotation(90); + } else { + gPreviewBackground.SetRotation(0); + } } JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_preprocess( @@ -731,32 +788,37 @@ JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_step( { if(!gWarpImage) // ViewFinder { - gWarper2.SetupGraphics(&gBuffer[gCurrentFBOIndex]); - gPreview.SetInputTextureName(gBuffer[gCurrentFBOIndex].GetTextureName()); - - gWarper2.DrawTexture(g_dTranslationToFBOCenterGL); - if (gIsLandscapeOrientation) { - gPreview.DrawTexture(g_dAffinetransIdentGL); + gPreviewBackground.DrawTexture(g_dAffinetransIdentGL); } else { - gPreview.DrawTexture(g_dAffinetransRotation90GL); + gPreviewBackground.DrawTexture(g_dAffinetransRotation90GL); + } + } + else if (gPreviewBackgroundImage) + { + if (gIsLandscapeOrientation) { + gPreviewBackground.DrawTexture(g_dAffinetransIdentGL); + } else { + gPreviewBackground.DrawTexture(g_dAffinetransRotation90GL); } } else { - gWarper1.SetupGraphics(&gBuffer[gCurrentFBOIndex]); - // Clear the destination so that we can paint on it afresh - gWarper1.Clear(0.0, 0.0, 0.0, 1.0); - gWarper1.SetInputTextureName( - gBuffer[1 - gCurrentFBOIndex].GetTextureName()); - gWarper2.SetupGraphics(&gBuffer[gCurrentFBOIndex]); - gPreview.SetInputTextureName(gBuffer[gCurrentFBOIndex].GetTextureName()); - - gWarper1.DrawTexture(g_dAffinetransGL); - gWarper2.DrawTexture(g_dTranslationToFBOCenterGL); - gPreview.DrawTexture(g_dAffinetransPanGL); - - gCurrentFBOIndex = 1 - gCurrentFBOIndex; + if (gEnableWarpedPanoPreview) { + gWarper1.SetupGraphics(&gBuffer[gCurrentFBOIndex]); + // Clear the destination so that we can paint on it afresh + gWarper1.Clear(0.0, 0.0, 0.0, 1.0); + gWarper1.SetInputTextureName( + gBuffer[1 - gCurrentFBOIndex].GetTextureName()); + gWarper2.SetupGraphics(&gBuffer[gCurrentFBOIndex]); + gPreview.SetInputTextureName(gBuffer[gCurrentFBOIndex].GetTextureName()); + + gWarper1.DrawTexture(g_dAffinetransGL); + gWarper2.DrawTexture(g_dTranslationToFBOCenterGL); + gPreview.DrawTexture(g_dAffinetransPanGL); + + gCurrentFBOIndex = 1 - gCurrentFBOIndex; + } } } @@ -766,15 +828,17 @@ JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_setWarping( // TODO: Review this logic if(gWarpImage != (bool) flag) //switching from viewfinder to capture or vice-versa { - // Clear gBuffer[0] - gWarper1.SetupGraphics(&gBuffer[0]); - gWarper1.Clear(0.0, 0.0, 0.0, 1.0); - // Clear gBuffer[1] - gWarper1.SetupGraphics(&gBuffer[1]); - gWarper1.Clear(0.0, 0.0, 0.0, 1.0); - // Clear the screen to black. - gPreview.Clear(0.0, 0.0, 0.0, 1.0); - + if (gEnableWarpedPanoPreview) { + // Clear gBuffer[0] + gWarper1.SetupGraphics(&gBuffer[0]); + gWarper1.Clear(0.0, 0.0, 0.0, 1.0); + // Clear gBuffer[1] + gWarper1.SetupGraphics(&gBuffer[1]); + gWarper1.Clear(0.0, 0.0, 0.0, 1.0); + // Clear the screen to black. + gPreview.Clear(0.0, 0.0, 0.0, 1.0); + } + gPreviewBackground.Clear(0.0, 0.0, 0.0, 1.0); gLastTx = 0.0f; gPanOffset = 0.0f; gPanViewfinder = true; @@ -802,3 +866,9 @@ JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_updateMatrix( g_dTranslationToFBOCenterGL[i] = g_dTranslationToFBOCenter[i]; } } + +JNIEXPORT void JNICALL Java_com_android_camera_MosaicRenderer_setPreviewBackground( + JNIEnv * env, jobject obj, jboolean flag) +{ + gPreviewBackgroundImage = (bool)flag; +} |