JNIEXPORT void JNICALL Java_org_cyanogenmod_focal_pano_MosaicRenderer_reset( JNIEnv * env, jobject obj, jint width, jint height, jboolean isLandscapeOrientation) { gIsLandscapeOrientation = isLandscapeOrientation; calculateUILayoutScaling(width, height, gIsLandscapeOrientation); gBuffer[0].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); gBuffer[1].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); gBufferInput[LR].Init(gPreviewImageWidth[LR], gPreviewImageHeight[LR], GL_RGBA); gBufferInput[HR].Init(gPreviewImageWidth[HR], gPreviewImageHeight[HR], GL_RGBA); gBufferInputYVU[LR].Init(gPreviewImageWidth[LR], gPreviewImageHeight[LR], GL_RGBA); gBufferInputYVU[HR].Init(gPreviewImageWidth[HR], gPreviewImageHeight[HR], GL_RGBA); // bind the surface texture bindSurfaceTexture(gSurfaceTextureID[0]); // To speed up, there is no need to clear the destination buffers // (offscreen/screen buffers) of gSurfTexRenderer, gYVURenderer // and gPreview because we always fill the whole destination buffers // when we draw something to those offscreen/screen buffers. gSurfTexRenderer[LR].SetupGraphics(&gBufferInput[LR]); gSurfTexRenderer[LR].SetViewportMatrix(1, 1, 1, 1); gSurfTexRenderer[LR].SetScalingMatrix(1.0f, -1.0f); gSurfTexRenderer[LR].SetInputTextureName(gSurfaceTextureID[0]); gSurfTexRenderer[LR].SetInputTextureType(GL_TEXTURE_EXTERNAL_OES_ENUM); gSurfTexRenderer[HR].SetupGraphics(&gBufferInput[HR]); gSurfTexRenderer[HR].SetViewportMatrix(1, 1, 1, 1); gSurfTexRenderer[HR].SetScalingMatrix(1.0f, -1.0f); gSurfTexRenderer[HR].SetInputTextureName(gSurfaceTextureID[0]); gSurfTexRenderer[HR].SetInputTextureType(GL_TEXTURE_EXTERNAL_OES_ENUM); gYVURenderer[LR].SetupGraphics(&gBufferInputYVU[LR]); gYVURenderer[LR].SetInputTextureName(gBufferInput[LR].GetTextureName()); gYVURenderer[LR].SetInputTextureType(GL_TEXTURE_2D); gYVURenderer[HR].SetupGraphics(&gBufferInputYVU[HR]); 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); }
JNIEXPORT void JNICALL Java_com_android_camera_panorama_MosaicRenderer_reset( JNIEnv * env, jobject obj, jint width, jint height, jboolean isLandscapeOrientation) { gIsLandscapeOrientation = isLandscapeOrientation; calculateUILayoutScaling(width, height, gIsLandscapeOrientation); gBuffer[0].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); gBuffer[1].Init(gPreviewFBOWidth, gPreviewFBOHeight, GL_RGBA); gBufferInput[LR].Init(gPreviewImageWidth[LR], gPreviewImageHeight[LR], GL_RGBA); gBufferInput[HR].Init(gPreviewImageWidth[HR], gPreviewImageHeight[HR], GL_RGBA); gBufferInputYVU[LR].Init(gPreviewImageWidth[LR], gPreviewImageHeight[LR], GL_RGBA); gBufferInputYVU[HR].Init(gPreviewImageWidth[HR], gPreviewImageHeight[HR], GL_RGBA); sem_wait(&gPreviewImage_semaphore); ClearPreviewImage(LR); ClearPreviewImage(HR); sem_post(&gPreviewImage_semaphore); // bind the surface texture bindSurfaceTexture(gSurfaceTextureID[0]); gSurfTexRenderer[LR].SetupGraphics(&gBufferInput[LR]); gSurfTexRenderer[LR].Clear(0.0, 0.0, 0.0, 1.0); gSurfTexRenderer[LR].SetViewportMatrix(1, 1, 1, 1); gSurfTexRenderer[LR].SetScalingMatrix(1.0f, -1.0f); gSurfTexRenderer[LR].SetInputTextureName(gSurfaceTextureID[0]); gSurfTexRenderer[LR].SetInputTextureType(GL_TEXTURE_EXTERNAL_OES_ENUM); gSurfTexRenderer[HR].SetupGraphics(&gBufferInput[HR]); gSurfTexRenderer[HR].Clear(0.0, 0.0, 0.0, 1.0); gSurfTexRenderer[HR].SetViewportMatrix(1, 1, 1, 1); gSurfTexRenderer[HR].SetScalingMatrix(1.0f, -1.0f); gSurfTexRenderer[HR].SetInputTextureName(gSurfaceTextureID[0]); gSurfTexRenderer[HR].SetInputTextureType(GL_TEXTURE_EXTERNAL_OES_ENUM); gYVURenderer[LR].SetupGraphics(&gBufferInputYVU[LR]); gYVURenderer[LR].Clear(0.0, 0.0, 0.0, 1.0); gYVURenderer[LR].SetInputTextureName(gBufferInput[LR].GetTextureName()); gYVURenderer[LR].SetInputTextureType(GL_TEXTURE_2D); gYVURenderer[HR].SetupGraphics(&gBufferInputYVU[HR]); gYVURenderer[HR].Clear(0.0, 0.0, 0.0, 1.0); gYVURenderer[HR].SetInputTextureName(gBufferInput[HR].GetTextureName()); gYVURenderer[HR].SetInputTextureType(GL_TEXTURE_2D); // gBuffer[1-gCurrentFBOIndex] --> gWarper1 --> gBuffer[gCurrentFBOIndex] gWarper1.SetupGraphics(&gBuffer[gCurrentFBOIndex]); 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]); gWarper2.Clear(0.0, 0.0, 0.0, 1.0); 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); gPreview.SetupGraphics(width, height); gPreview.Clear(0.0, 0.0, 0.0, 1.0); 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); }