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