| /* |
| * Copyright 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.FileReader; |
| import java.io.IOException; |
| import java.io.PrintStream; |
| |
| public class GenerateEGL { |
| |
| private static void copy(String filename, PrintStream out) throws IOException { |
| BufferedReader br = new BufferedReader(new FileReader(filename)); |
| String s; |
| while ((s = br.readLine()) != null) { |
| out.println(s); |
| } |
| } |
| |
| private static void emit(EGLCodeEmitter emitter, |
| BufferedReader specReader, |
| PrintStream glStream, |
| PrintStream cStream) throws Exception { |
| String s = null; |
| while ((s = specReader.readLine()) != null) { |
| if (s.trim().startsWith("//")) { |
| continue; |
| } |
| |
| CFunc cfunc = CFunc.parseCFunc(s); |
| |
| String fname = cfunc.getName(); |
| String stubRoot = "stubs/egl/" + fname; |
| String javaPath = stubRoot + ".java"; |
| File f = new File(javaPath); |
| if (f.exists()) { |
| System.out.println("Special-casing function " + fname); |
| copy(javaPath, glStream); |
| copy(stubRoot + ".cpp", cStream); |
| |
| // Register native function names |
| // This should be improved to require fewer discrete files |
| String filename = stubRoot + ".nativeReg"; |
| BufferedReader br = |
| new BufferedReader(new FileReader(filename)); |
| String nfunc; |
| while ((nfunc = br.readLine()) != null) { |
| emitter.addNativeRegistration(nfunc); |
| } |
| } else { |
| emitter.emitCode(cfunc, s); |
| } |
| } |
| } |
| |
| public static void main(String[] args) throws Exception { |
| int aidx = 0; |
| while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) { |
| switch (args[aidx].charAt(1)) { |
| default: |
| System.err.println("Unknown flag: " + args[aidx]); |
| System.exit(1); |
| } |
| |
| aidx++; |
| } |
| |
| BufferedReader checksReader = |
| new BufferedReader(new FileReader("specs/egl/checks.spec")); |
| ParameterChecker checker = new ParameterChecker(checksReader); |
| |
| |
| for(String suffix: new String[] {"EGL14", "EGL15", "EGLExt"}) { |
| BufferedReader specReader = new BufferedReader(new FileReader( |
| "specs/egl/" + suffix + ".spec")); |
| String egljFilename = "android/opengl/" + suffix + ".java"; |
| String eglcFilename = "android_opengl_" + suffix + ".cpp"; |
| PrintStream egljStream = |
| new PrintStream(new FileOutputStream("out/" + egljFilename)); |
| PrintStream eglcStream = |
| new PrintStream(new FileOutputStream("out/" + eglcFilename)); |
| copy("stubs/egl/" + suffix + "Header.java-if", egljStream); |
| copy("stubs/egl/" + suffix + "cHeader.cpp", eglcStream); |
| EGLCodeEmitter emitter = new EGLCodeEmitter( |
| "android/opengl/" + suffix, |
| checker, egljStream, eglcStream); |
| emit(emitter, specReader, egljStream, eglcStream); |
| emitter.emitNativeRegistration( |
| "register_android_opengl_jni_" + suffix); |
| egljStream.println("}"); |
| egljStream.close(); |
| eglcStream.close(); |
| } |
| } |
| } |