1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2009 The Android Open Source Project
3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License.
6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at
7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software
11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and
14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License.
15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */
16bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root
17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.PrintStream;
18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich/**
20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich * Emits a Java interface and Java & C implementation for a C function.
21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich *
22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich * <p> The Java interface will have Buffer and array variants for functions that
23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich * have a typed pointer argument.  The array variant will convert a single "<type> *data"
24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich * argument to a pair of arguments "<type>[] data, int offset".
25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich */
26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class Jsr239CodeEmitter extends JniCodeEmitter implements CodeEmitter {
27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJava10InterfaceStream;
29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJava10ExtInterfaceStream;
30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJava11InterfaceStream;
31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJava11ExtInterfaceStream;
32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJava11ExtPackInterfaceStream;
33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJavaImplStream;
34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mCStream;
35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    PrintStream mJavaInterfaceStream;
37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    /**
39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param java10InterfaceStream the PrintStream to which to emit the Java interface for GL 1.0 functions
40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param java10ExtInterfaceStream the PrintStream to which to emit the Java interface for GL 1.0 extension functions
41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param java11InterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 functions
42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param java11ExtInterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 Extension functions
43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param java11ExtPackInterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 Extension Pack functions
44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param javaImplStream the PrintStream to which to emit the Java implementation
45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     * @param cStream the PrintStream to which to emit the C implementation
46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich     */
47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public Jsr239CodeEmitter(String classPathName,
48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          ParameterChecker checker,
49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream java10InterfaceStream,
50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream java10ExtInterfaceStream,
51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream java11InterfaceStream,
52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream java11ExtInterfaceStream,
53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream java11ExtPackInterfaceStream,
54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream javaImplStream,
55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          PrintStream cStream,
56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                          boolean useContextPointer) {
57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mClassPathName = classPathName;
58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mChecker = checker;
59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJava10InterfaceStream = java10InterfaceStream;
60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJava10ExtInterfaceStream = java10ExtInterfaceStream;
61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJava11InterfaceStream = java11InterfaceStream;
62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJava11ExtInterfaceStream = java11ExtInterfaceStream;
63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJava11ExtPackInterfaceStream = java11ExtPackInterfaceStream;
64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mJavaImplStream = javaImplStream;
65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mCStream = cStream;
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        mUseContextPointer = useContextPointer;
67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setVersion(int version, boolean ext, boolean pack) {
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        if (version == 0) {
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            mJavaInterfaceStream = ext ? mJava10ExtInterfaceStream :
72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                mJava10InterfaceStream;
73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        } else if (version == 1) {
74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            mJavaInterfaceStream = ext ?
75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                (pack ? mJava11ExtPackInterfaceStream :
76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                 mJava11ExtInterfaceStream) :
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                mJava11InterfaceStream;
78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        } else {
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            throw new RuntimeException("Bad version: " + version);
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void emitCode(CFunc cfunc, String original) {
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emitCode(cfunc, original, mJavaInterfaceStream, mJavaImplStream, mCStream);
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void emitNativeRegistration() {
88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emitNativeRegistration("register_com_google_android_gles_jni_GLImpl", mCStream);
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
91