2003/09/25 12:13:46
[org.ibex.core.git] / src / org / xwt / plat / GCJ.cc
index b35c94f..bba04f8 100644 (file)
@@ -1,20 +1,51 @@
-#include <stdlib.h>
-#include <stdio.h>
+// Copyright 2002 Adam Megacz, see the COPYING file for licensing [LGPL]
+
+// Inclusions /////////////////////////////////////////////////////////
+
 #include <gcj/cni.h>
 #include <gcj/array.h>
-#include "jpeglib.h"
-#include <setjmp.h>
+extern "C" {
 
-#include <java/lang/RuntimeException.h>
+// hack for broken Solaris headers
+#define _WCHAR_T
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <setjmp.h>
+#include "jpeglib.h"
+}
+#include <org/xwt/Platform.h>
+#include <org/xwt/Picture.h>
+#include <org/xwt/plat/GCJ.h>
 #include <java/io/InputStream.h>
+#include <java/io/ByteArrayInputStream.h>
+#include <java/lang/RuntimeException.h>
 #include <org/xwt/plat/GCJ.h>
-#include <org/xwt/plat/GCJ$JPEG.h>
+
+
+
+// builtin.xwar /////////////////////////////////////////////////////////
+
+extern unsigned char builtin_bytes[];
+extern int builtin_length;
+
+java::io::InputStream* org::xwt::plat::GCJ::_getBuiltinInputStream() {
+    jbyteArray ret = JvNewByteArray(builtin_length);
+    memcpy(elements(ret), builtin_bytes, builtin_length);
+    return new java::io::ByteArrayInputStream(ret);
+}
+
+
+
+// JPEG ////////////////////////////////////////////////////////////////
 
 #define INPUT_BUF_SIZE (1024 * 16)
 
 typedef struct {
     struct jpeg_source_mgr pub;
+    /* FIXME
     org::xwt::plat::GCJ$JPEG* myself;
+    */
 } source_manager;
 
 void jpeg_error_handler (j_common_ptr cinfo) {
@@ -26,6 +57,7 @@ void term_source (j_decompress_ptr cinfo) { }
 void init_source (j_decompress_ptr cinfo) { }
 
 boolean fill_input_buffer (j_decompress_ptr cinfo) {
+  /* FIXME
   source_manager* src = (source_manager*)cinfo->src;
   jint nbytes = src->myself->is->read(src->myself->buffer, 0, INPUT_BUF_SIZE);
   if (nbytes <= 0) {
@@ -36,6 +68,7 @@ boolean fill_input_buffer (j_decompress_ptr cinfo) {
   }
   src->pub.next_input_byte = (JOCTET*)elements(src->myself->buffer);
   src->pub.bytes_in_buffer = nbytes;
+  */
   return 1;
 }
 
@@ -51,8 +84,11 @@ void skip_input_data (j_decompress_ptr cinfo, long num_bytes) {
   }
 }
 
-void org::xwt::plat::GCJ$JPEG::nativeDecompress() {
+org::xwt::Picture* org::xwt::plat::GCJ::_decodeJPEG(java::io::InputStream* is, jstring name) {
     struct jpeg_decompress_struct cinfo;
+    jintArray data;
+    jint width;
+    jint height;
   
     // set up our error handler
     struct jpeg_error_mgr error_handler;
@@ -62,14 +98,18 @@ void org::xwt::plat::GCJ$JPEG::nativeDecompress() {
     jpeg_create_decompress(&cinfo);
     try {
        source_manager src;
+       /*
        buffer = JvNewByteArray(INPUT_BUF_SIZE);
+       */
        src.pub.init_source = init_source;
        src.pub.fill_input_buffer = fill_input_buffer;
        src.pub.skip_input_data = skip_input_data;
        src.pub.resync_to_restart = jpeg_resync_to_restart;
        src.pub.term_source = term_source;
+       /*
        src.myself = this;
        src.pub.next_input_byte = (JOCTET*)elements(buffer);
+       */
        src.pub.bytes_in_buffer = 0;
        cinfo.src = (jpeg_source_mgr*)&src;
 
@@ -95,6 +135,11 @@ void org::xwt::plat::GCJ$JPEG::nativeDecompress() {
         throw t;
     }
     jpeg_destroy_decompress(&cinfo);
+    return org::xwt::Platform::createPicture(data, width, height);
 }
 
-
+// C++ new/delete operators (JvMalloc never fails)
+void* operator new(size_t size) { return JvMalloc(size); }
+void* operator new[](size_t size) { return JvMalloc(size);}
+void operator delete(void *p) { JvFree(p); }
+void operator delete[](void *p) { JvFree(p); }