154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * you may not use this file except in compliance with the License. 654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * You may obtain a copy of the License at 754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 1054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * See the License for the specific language governing permissions and 1454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * limitations under the License. 1554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 1654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 1754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#define LOG_TAG "Surface" 1854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include <utils/Log.h> 1954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 20289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android/native_window_jni.h> 218335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 22289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_view_Surface.h> 23846db33313aa0899fa7928256c6734964bd92520Glenn Kasten#include <android_runtime/android_graphics_SurfaceTexture.h> 2454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 25289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornusing namespace android; 26289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 27289b9b62372ef52a06113b83dfb870e2c2fb325aDianne HackbornANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface) { 2864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown sp<ANativeWindow> win = android_view_Surface_getNativeWindow(env, surface); 29289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (win != NULL) { 30289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn win->incStrong((void*)ANativeWindow_acquire); 31289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 32289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return win.get(); 33289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 34289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 35289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid ANativeWindow_acquire(ANativeWindow* window) { 36289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn window->incStrong((void*)ANativeWindow_acquire); 37289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 38289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 39289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid ANativeWindow_release(ANativeWindow* window) { 40289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn window->decStrong((void*)ANativeWindow_acquire); 41289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 4254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 4354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 4454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn int value; 4554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn int res = window->query(window, what, &value); 4654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn return res < 0 ? res : value; 4754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} 4854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 4954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornint32_t ANativeWindow_getWidth(ANativeWindow* window) { 5054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn return getWindowProp(window, NATIVE_WINDOW_WIDTH); 5154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} 5254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 5354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornint32_t ANativeWindow_getHeight(ANativeWindow* window) { 5454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn return getWindowProp(window, NATIVE_WINDOW_HEIGHT); 5554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} 5654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 5754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornint32_t ANativeWindow_getFormat(ANativeWindow* window) { 5854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn return getWindowProp(window, NATIVE_WINDOW_FORMAT); 5954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} 608ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn 618ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackbornint32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, int32_t width, 623026a1c4e88412b7fe997f93fedba871d79a03cdMathias Agopian int32_t height, int32_t format) { 630e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold int32_t err = native_window_set_buffers_format(window, format); 6409d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian if (!err) { 650e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold err = native_window_set_buffers_user_dimensions(window, width, height); 660e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold if (!err) { 670e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold int mode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 680e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold if (width && height) { 690e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold mode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW; 700e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold } 710e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold err = native_window_set_scaling_mode(window, mode); 720e5ed706a2a7c85ddb11bcac55a6e210f725c3f9Michael I. Gold } 7309d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian } 7409d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian return err; 758ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn} 76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 77289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornint32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer, 78289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ARect* inOutDirtyBounds) { 79949be32b671304d5281ac0abbf30dcf4ebaa9eafMathias Agopian return window->perform(window, NATIVE_WINDOW_LOCK, outBuffer, inOutDirtyBounds); 80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornint32_t ANativeWindow_unlockAndPost(ANativeWindow* window) { 83949be32b671304d5281ac0abbf30dcf4ebaa9eafMathias Agopian return window->perform(window, NATIVE_WINDOW_UNLOCK_AND_POST); 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 85