2004/01/13 10:27:47
[org.ibex.core.git] / src / org / xwt / translators / Freetype.c
index f1b4f50..f8172d9 100644 (file)
@@ -1,5 +1,6 @@
 // Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
 
+#include <unistd.h>
 #include <freetype/freetype.h>
 
 /* NOTE: _user_info is defined in crt0.c. It points to a 4096 byte
 
 */
 
+#if 0
+/* Use this when org.xwt.mips is updated to the latest org.xwt.mips cvs */
+extern char *user_info[1024];
+#else
 extern char **_user_info;
-
-FT_Library  library;   /* handle to library     */
-FT_Face     face;      /* handle to face object */
+#define user_info _user_info
+#define _pause emu_pause
+#endif
 
 #define FT_Check(expr) do { \
     if((expr) != 0) { \
-        fprintf(stderr, #expr " failed\n"); \
+        errprint(#expr " failed\n"); \
         exit(EXIT_FAILURE); \
     } \
 } while(0)
@@ -48,33 +53,47 @@ FT_Face     face;      /* handle to face object */
 #define max(a, b) ((a) > (b) ? (a) : (b))
 #define min(a, b) ((a) < (b) ? (a) : (b))
 
-extern void emu_pause();
+static int errprint(const char *s) {
+    int l = strlen(s);
+    int n;
+    while(l) {
+        n = write(STDERR_FILENO,s,l);
+        if(n < 0) return n;
+        l -= n;
+        s += n;
+    }
+    return 0;
+}
 
-int main(int argc, char** argv) {
+extern void _pause();
+
+int freetype_main() {
     char *fontdata;
     int glyph_index;
     short charcode;
-    
+    FT_Library  library;   /* handle to library     */
+    FT_Face     face;      /* handle to face object */
+
     FT_Check(FT_Init_FreeType(&library));
-    FT_Check(FT_New_Memory_Face(library, _user_info[0], (int)_user_info[1], 0, &face));
+    FT_Check(FT_New_Memory_Face(library, user_info[0], (int)user_info[1], 0, &face));
 
     for(;;) {
       
-        emu_pause();
-        FT_Check(FT_Set_Char_Size(face, 0, ((int)_user_info[4]) * 64, 72, 72));
-        for(charcode = (int)_user_info[2]; charcode <= (int)_user_info[3]; charcode++) {
+        _pause();
+        FT_Check(FT_Set_Char_Size(face, 0, ((int)user_info[4]) * 64, 72, 72));
+        for(charcode = (int)user_info[2]; charcode <= (int)user_info[3]; charcode++) {
 
             glyph_index = FT_Get_Char_Index(face, charcode);
             FT_Check(FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT | FT_LOAD_FORCE_AUTOHINT));
             FT_Check(FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL));
 
-            _user_info[5]  = (char*)face->glyph->bitmap.buffer;
-            _user_info[6]  = (char*)face->glyph->bitmap.width;
-            _user_info[7]  = (char*)face->glyph->bitmap.rows;
-            _user_info[8]  = (char*)(face->size->metrics.ascender >> 6);
-            _user_info[9]  = (char*)((-1 * face->size->metrics.descender) >> 6);
-            _user_info[10] = (char*)(face->glyph->metrics.horiBearingY >> 6);
-            _user_info[11] = (char*)(face->glyph->advance.x >> 6);
+            user_info[5]  = (char*)face->glyph->bitmap.buffer;
+            user_info[6]  = (char*)face->glyph->bitmap.width;
+            user_info[7]  = (char*)face->glyph->bitmap.rows;
+            user_info[8]  = (char*)(face->size->metrics.ascender >> 6);
+            user_info[9]  = (char*)((-1 * face->size->metrics.descender) >> 6);
+            user_info[10] = (char*)(face->glyph->metrics.horiBearingY >> 6);
+            user_info[11] = (char*)(face->glyph->advance.x >> 6);
 
         }
     }