19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 238451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes#include "JNIHelp.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct offsets_t { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID bytesPerPixel; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID bitsPerPixel; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic offsets_t offsets; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_graphics_getPixelFormatInfo( 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz, jint format, jobject pixelFormatObject) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 46a696f5d667227365da732481770767dcb330dd23Mathias Agopian status_t err; 47a696f5d667227365da732481770767dcb330dd23Mathias Agopian 48a696f5d667227365da732481770767dcb330dd23Mathias Agopian // we need this for backward compatibility with PixelFormat's 49a696f5d667227365da732481770767dcb330dd23Mathias Agopian // deprecated constants 50a696f5d667227365da732481770767dcb330dd23Mathias Agopian switch (format) { 51a696f5d667227365da732481770767dcb330dd23Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 52a696f5d667227365da732481770767dcb330dd23Mathias Agopian // defined as the bytes per pixel of the Y plane 53a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bytesPerPixel = 1; 54a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bitsPerPixel = 16; 55a696f5d667227365da732481770767dcb330dd23Mathias Agopian goto done; 56a696f5d667227365da732481770767dcb330dd23Mathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 57a696f5d667227365da732481770767dcb330dd23Mathias Agopian // defined as the bytes per pixel of the Y plane 58a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bytesPerPixel = 1; 59a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bitsPerPixel = 12; 60a696f5d667227365da732481770767dcb330dd23Mathias Agopian goto done; 61a696f5d667227365da732481770767dcb330dd23Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 62a696f5d667227365da732481770767dcb330dd23Mathias Agopian // defined as the bytes per pixel of the Y plane 63a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bytesPerPixel = 1; 64a696f5d667227365da732481770767dcb330dd23Mathias Agopian info.bitsPerPixel = 16; 65a696f5d667227365da732481770767dcb330dd23Mathias Agopian goto done; 66a696f5d667227365da732481770767dcb330dd23Mathias Agopian } 67a696f5d667227365da732481770767dcb330dd23Mathias Agopian 68a696f5d667227365da732481770767dcb330dd23Mathias Agopian err = getPixelFormatInfo(format, &info); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 708451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73a696f5d667227365da732481770767dcb330dd23Mathias Agopian 74a696f5d667227365da732481770767dcb330dd23Mathias Agopiandone: 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(pixelFormatObject, offsets.bytesPerPixel, info.bytesPerPixel); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(pixelFormatObject, offsets.bitsPerPixel, info.bitsPerPixel); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kClassPathName = "android/graphics/PixelFormat"; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void nativeClassInit(JNIEnv* env, jclass clazz); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeClassInit", "()V", 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)nativeClassInit }, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getPixelFormatInfo", "(ILandroid/graphics/PixelFormat;)V", 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_graphics_getPixelFormatInfo 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid nativeClassInit(JNIEnv* env, jclass clazz) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.bytesPerPixel = env->GetFieldID(clazz, "bytesPerPixel", "I"); 958451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes offsets.bitsPerPixel = env->GetFieldID(clazz, "bitsPerPixel", "I"); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_PixelFormat(JNIEnv* env) 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, gMethods, NELEM(gMethods)); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 105