From 42da60bd167403eccc3466575772819007388cfd Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 07:36:10 +0000 Subject: [PATCH] 2003/09/23 08:25:00 darcs-hash:20040130073610-2ba56-97fa628e43518d8a70c1b1b24cf8bd8f79a9a046.gz --- src/org/xwt/plat/Darwin.cc | 22 ++-- src/org/xwt/plat/Darwin.java | 23 ++-- src/org/xwt/plat/GCJ.cc | 8 +- src/org/xwt/plat/GCJ.java | 24 +---- src/org/xwt/plat/OpenGL.java | 2 +- src/org/xwt/plat/Win32.cc | 94 +--------------- src/org/xwt/plat/Win32.java | 60 +---------- src/org/xwt/plat/X11.cc | 2 +- src/org/xwt/plat/X11.java | 148 +------------------------- src/org/xwt/translators/Font.java | 30 ++---- src/org/xwt/translators/GIF.java | 16 +-- src/org/xwt/translators/PNG.java | 28 ++--- src/org/xwt/util/InputStreamToByteArray.java | 28 +++++ src/org/xwt/util/Vec.java | 1 + 14 files changed, 92 insertions(+), 394 deletions(-) create mode 100644 src/org/xwt/util/InputStreamToByteArray.java diff --git a/src/org/xwt/plat/Darwin.cc b/src/org/xwt/plat/Darwin.cc index 6f4789d..f946729 100644 --- a/src/org/xwt/plat/Darwin.cc +++ b/src/org/xwt/plat/Darwin.cc @@ -697,7 +697,7 @@ void Darwin$CarbonSurface::natInit(jboolean framed) { // FIXME: unframed windows should appear in the window menu // This probably needs a hack similar to whats in Cocoa.mm WindowAttributes attr = kWindowStandardHandlerAttribute| - (framed ? kWindowInWindowMenuAttribute|kWindowStandardDocumentAttributes|kWindowLiveResizeAttribute : 0); + (framed ? kWindowInWindowMenuAttribute|kWindowStandardDocumentAttributes|kWindowLiveResizeAttribute : 0); OSStatus r; rect.top = 0; rect.left = 0; rect.bottom = 300; rect.right=300; EventHandlerUPP upp = WC(NewEventHandlerUPP)(our_windowEventHandler); @@ -710,12 +710,14 @@ void Darwin$CarbonSurface::natInit(jboolean framed) { WindowDefSpec myCustomWindowSpec; myCustomWindowSpec.defType = kWindowDefObjectClass; myCustomWindowSpec.u.classRef = customWindow; + r = WC(CreateCustomWindow) (&myCustomWindowSpec, - kDocumentWindowClass, - kWindowStandardHandlerAttribute | kWindowStandardDocumentAttributes, - &rect, - &window); + kDocumentWindowClass, + kWindowStandardHandlerAttribute | kWindowStandardDocumentAttributes, + &rect, + &window); + //r = CreateNewWindow(kDocumentWindowClass, attr, &rect, &window); Darwin$CarbonSurface* me = this; WC(SetWindowProperty) (window, 'XWT!', 'XWT!', sizeof(me), &me); checkStatus(r,"WC(CreateNewWindow)"); @@ -738,9 +740,11 @@ void Darwin$CarbonSurface::natDispose() { void Darwin$CarbonSurface::natSetIcon(org::xwt::Picture *_p) { } -void Darwin$CarbonSurface::natSetLocation(jint x, jint y) { +void Darwin$CarbonSurface::natSetLocation() { WindowRef window = (WindowRef) rawWindowRef; Rect rect; + jint x = root->x; + jint y = root->y; OSStatus r = WC(GetWindowBounds)(window,kWindowStructureRgn,&rect); checkStatus(r,"WC(GetWindowBounds)"); rect.bottom = y + (rect.bottom - rect.top); @@ -1012,10 +1016,6 @@ void Darwin::_newBrowserWindow(jstring js) { WC(CFRelease)(url); } -void Darwin::_exit() { - WC(QuitApplicationEventLoop)(); -} - void Darwin::natInit() { OSStatus r; #ifdef XWT_CARBON_NO_BUNDLE_HACK @@ -1044,7 +1044,7 @@ void Darwin::natInit() { #endif } -void Darwin::_running() { +void Darwin::runApplicationEventLoop() { WC(RunApplicationEventLoop)(); WC(ExitToShell)(); } diff --git a/src/org/xwt/plat/Darwin.java b/src/org/xwt/plat/Darwin.java index d6aa8d8..7a9b749 100644 --- a/src/org/xwt/plat/Darwin.java +++ b/src/org/xwt/plat/Darwin.java @@ -13,11 +13,6 @@ public class Darwin extends POSIX { private CarbonOpenGL openGL; boolean jaguar; // true if we are on OS X >= 10.2 - // TEMPORARY HACKS (remove these when we ditch platform fonts) - protected int _stringWidth(String font, String text) { return (int)Math.round(6.5 * text.length()); } - protected int _getMaxAscent(String font) { return 10; } - protected int _getMaxDescent(String font) { return 2; } - // General Methods protected String _getAltKeyName() { return "Option"; } protected boolean _needsAutoClick() { return false; } @@ -34,7 +29,6 @@ public class Darwin extends POSIX { protected native void _newBrowserWindow(String url); protected native HTTP.Proxy natDetectProxy(); private native void natInit(); - protected native void _exit(); private native String natGetClipBoard(); private native void natSetClipBoard(String text); @@ -67,9 +61,6 @@ public class Darwin extends POSIX { } - // Called by main thread after initialization, this is the event handler - protected native void _running(); - static void abort(String err) { throw new Error(err); } @@ -87,6 +78,9 @@ public class Darwin extends POSIX { private static native final boolean isJaguar(); + // Called by main thread after initialization, this is the event handler + protected native void runApplicationEventLoop(); + public void init() { super.init(); jaguar = isJaguar(); @@ -99,6 +93,11 @@ public class Darwin extends POSIX { throw new Error("No OpenGL support"); } natInit(); + new Thread() { + public void run() { + runApplicationEventLoop(); + } + }.start(); } private final class CarbonOpenGL extends OpenGL { @@ -131,7 +130,7 @@ public class Darwin extends POSIX { protected native void activateSharedContext(); } - static abstract class CarbonSurface extends Surface { + static abstract class CarbonSurface extends Surface.DoubleBufferedSurface { RawData rawWindowRef; RawData rawEventHandlerUPP; int modifiers; @@ -148,8 +147,8 @@ public class Darwin extends POSIX { public void setTitleBarText(final String s) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetTitleBarText(s); } }); } private native void natSetSize(int w, int h); public void setSize(final int w, final int h) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetSize(w,h); } }); } - private native void natSetLocation(int x, int y); - public void setLocation(final int x, final int y) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLocation(x,y); } }); } + private native void natSetLocation(); + public void setLocation() { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLocation(); } }); } private native void natToFront(); public void toFront() { CarbonMessage.add(new CarbonMessage() { public void perform() { natToFront(); } }); } private native void natToBack(); diff --git a/src/org/xwt/plat/GCJ.cc b/src/org/xwt/plat/GCJ.cc index 3050a2b..f63c515 100644 --- a/src/org/xwt/plat/GCJ.cc +++ b/src/org/xwt/plat/GCJ.cc @@ -14,6 +14,8 @@ extern "C" { #include #include "jpeglib.h" } +#include +#include #include #include #include @@ -79,8 +81,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$JPEG::_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; @@ -123,6 +128,7 @@ 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) diff --git a/src/org/xwt/plat/GCJ.java b/src/org/xwt/plat/GCJ.java index 0e638a2..1a7c41b 100644 --- a/src/org/xwt/plat/GCJ.java +++ b/src/org/xwt/plat/GCJ.java @@ -22,30 +22,8 @@ public abstract class GCJ extends Platform { protected native InputStream _getBuiltinInputStream(); // FIXME - protected ImageDecoder _decodeJPEG(InputStream is, String name) { - try { - return new JPEG(is); - } catch (Exception e) { - Log.log(this, "Exception while decoding JPEG image " + name); - Log.log(this, e); - return null; - } - } + protected native Picture _decodeJPEG(InputStream is, String name); - /** Converts an InputStream carrying a JPEG image into an ARGB int[] */ - private static class JPEG extends ImageDecoder { - int[] data; - byte[] buffer; - int width, height; - InputStream is; - - public final int[] getData() { return data; } - public final int getWidth() { return width; } - public final int getHeight() { return height; } - private JPEG(InputStream is) { this.is = is; nativeDecompress(); buffer = null; } - private native void nativeDecompress(); - } - // FIXME: This could be optimized (a lot) by using a custom hashtable public final static class Retainer { private static Hash table = new Hash(); diff --git a/src/org/xwt/plat/OpenGL.java b/src/org/xwt/plat/OpenGL.java index ecacec1..6e89350 100644 --- a/src/org/xwt/plat/OpenGL.java +++ b/src/org/xwt/plat/OpenGL.java @@ -109,7 +109,7 @@ abstract class OpenGL { public void deleteTexture(final int tex) { // CHECKME: Is this safe to do from finalize()? // natDeleteTexture MUST be run from the message queue thread - MessageQueue.add(new Message() { public void perform() { + Message.Q.add(new Message() { public void perform() { natDeleteTexture(tex); }}); } diff --git a/src/org/xwt/plat/Win32.cc b/src/org/xwt/plat/Win32.cc index 06c5195..25812a3 100644 --- a/src/org/xwt/plat/Win32.cc +++ b/src/org/xwt/plat/Win32.cc @@ -28,9 +28,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -64,25 +62,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { } } -// This function iterates over each family (lparam == 0), and then over each size (lparam == 1) -int CALLBACK fontproc(const LOGFONTA* enumlogfont, const TEXTMETRICA* tm, long unsigned int type, LPARAM lparam) { - - if (lparam == 0) { - LOGFONT lf; - lf.lfCharSet = ANSI_CHARSET; - strncpy(lf.lfFaceName, enumlogfont->lfFaceName, 32); - lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx((HDC)org::xwt::plat::Win32::desktop_dc, &lf, fontproc, 1, 0); - - } else { - org::xwt::plat::Win32::addFont(JvNewStringLatin1(enumlogfont->lfFaceName), - ((type & RASTER_FONTTYPE) == 0) ? 0 : tm->tmHeight, - tm->tmItalic == 0 ? 0 : 1, - tm->tmWeight <= 400 ? 0 : 1); - } - return 1; -} - // Initialization //////////////////////////////////////////////////////////////////// @@ -186,13 +165,6 @@ void org::xwt::plat::Win32::natInit() { org::xwt::plat::Win32::sizewe_cursor = (jint)LoadCursor(NULL, IDC_SIZEWE); org::xwt::plat::Win32::hand_cursor = (jint)CreateCursor(GetModuleHandle(NULL), 14, 1, 32, 32, hand_cursor_and, hand_cursor_xor); - // enumerate fonts - LOGFONT lf; - lf.lfCharSet = ANSI_CHARSET; - lf.lfFaceName[0] = 0; - lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx((HDC)desktop_dc, &lf, fontproc, 0, 0); - messagePumpThread = (jint)GetCurrentThreadId(); messagePumpStarted->release(); @@ -353,50 +325,6 @@ jint org::xwt::plat::Win32::_getScreenHeight() { return rect.bottom - rect.top; } -org::xwt::plat::Win32$Win32Font* org::xwt::plat::Win32::mapFont(org::xwt::Platform$ParsedFont* pf) { - org::xwt::plat::Win32$Win32Font* ret = new org::xwt::plat::Win32$Win32Font(); - LOGFONT logfont; - memset(&logfont, 0, sizeof(LOGFONT)); - logfont.lfHeight = -MulDiv(pf->size, GetDeviceCaps((HDC)org::xwt::plat::Win32::desktop_dc, LOGPIXELSY), 72); - if (pf->italic) logfont.lfItalic = 1; - if (pf->bold) logfont.lfWeight = FW_BOLD; - logfont.lfCharSet = ANSI_CHARSET; - - JvGetStringUTFRegion(pf->name, 0, min(31, JvGetStringUTFLength(pf->name)), logfont.lfFaceName); - logfont.lfFaceName[min(31, JvGetStringUTFLength(pf->name))] = 0; - - ret->hfont = (jint)CreateFontIndirect(&logfont); - SelectObject((HDC)desktop_dc, (HFONT)(ret->hfont)); - - TEXTMETRIC tm; - GetTextMetrics((HDC)desktop_dc, &tm); - POINT p; - p.x = 0; p.y = tm.tmAscent; - LPtoDP((HDC)desktop_dc, &p, 1); - ret->maxAscent = p.y; - - p.x = 0; p.y = tm.tmDescent; - LPtoDP((HDC)desktop_dc, &p, 1); - ret->maxDescent = p.y; - - return ret; -} - -jint org::xwt::plat::Win32::_stringWidth(jstring font, jstring text) { - - HFONT hfont = (HFONT)(getFont(font)->hfont); - SelectObject((HDC)org::xwt::plat::Win32::desktop_dc, hfont); - - int len = min(1024, JvGetStringUTFLength(text)); - char buf[len + 1]; - buf[len] = '\0'; - JvGetStringUTFRegion(text, 0, len, buf); - - SIZE size; - GetTextExtentPoint32((HDC)org::xwt::plat::Win32::desktop_dc, buf, len, &size); - return size.cx; -} - jboolean org::xwt::plat::Win32::_newBrowserWindow_(jstring url) { int len = min(2048, JvGetStringUTFLength(url)); @@ -494,23 +422,6 @@ void org::xwt::plat::Win32$Win32PixelBuffer::drawPicture(org::xwt::Picture* sour } -void org::xwt::plat::Win32$Win32PixelBuffer::drawString(jstring font, jstring text, jint x, jint y, jint color) { - - org::xwt::plat::Win32$Win32Font* wf = org::xwt::plat::Win32::getFont(font); - SelectObject((HDC)hdc, (HFONT)(wf->hfont)); - - // Platform API passes us the y-pos of the bottom of the text; we need the top - y -= wf->maxAscent; - - int len = min(1024, JvGetStringUTFLength(text)); - char buf[len + 1]; - buf[len] = '\0'; - JvGetStringUTFRegion(text, 0, len, buf); - - SetTextColor((HDC)hdc, PALETTERGB((color & 0xFF0000) >> 16, (color & 0xFF00) >> 8, color & 0xFF)); - TextOut((HDC)hdc, x, y, buf, len); -} - void org::xwt::plat::Win32$Win32PixelBuffer::fillRect(jint x, jint y, jint x2, jint y2, jint color) { jint w = x2 - x; jint h = y2 - y; @@ -626,14 +537,14 @@ void org::xwt::plat::Win32$Win32Surface::_setMinimized(jboolean m) { ShowWindow( void org::xwt::plat::Win32$Win32Surface::_setMaximized(jboolean m) { ShowWindow((HWND)hwnd, m ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL); } void org::xwt::plat::Win32$Win32Surface::postCursorChange() { PostMessage((HWND)hwnd, WM_USER_SETCURSOR, 0, 0); } -void org::xwt::plat::Win32$Win32Surface::setLocation(jint x, jint y) { +void org::xwt::plat::Win32$Win32Surface::setLocation() { POINT point; RECT rect; point.x = 0; point.y = 0; ClientToScreen((HWND)hwnd, &point); GetWindowRect((HWND)hwnd, &rect); - SetWindowPos((HWND)hwnd, NULL, x - (point.x - rect.left), y - (point.y - rect.top), 0, 0, SWP_NOZORDER | SWP_NOSIZE); + SetWindowPos((HWND)hwnd, NULL, root->x - (point.x - rect.left), root->y - (point.y - rect.top), 0, 0, SWP_NOZORDER | SWP_NOSIZE); } void org::xwt::plat::Win32$Win32Surface::setSize(jint w, jint h) { @@ -711,7 +622,6 @@ jint org::xwt::plat::Win32$Win32Surface::WndProc(jint _hwnd, jint _iMsg, jint _w switch(iMsg) { case WM_DEVMODECHANGE: break; // FEATURE: color depth changed case WM_DISPLAYCHANGE: break; // FEATURE: screen size changed - case WM_FONTCHANGE: break; // FEATURE: set of fonts changed case WM_MOUSEWHEEL: break; // FEATURE: Mouse Wheel case WM_SYSKEYDOWN: if (GetKeyState(VK_MENU) >> (sizeof(SHORT) * 8 - 1) == 0) return 0; diff --git a/src/org/xwt/plat/Win32.java b/src/org/xwt/plat/Win32.java index f0b6a69..b57109c 100644 --- a/src/org/xwt/plat/Win32.java +++ b/src/org/xwt/plat/Win32.java @@ -55,61 +55,6 @@ public class Win32 extends GCJ { new Thread() { public void run() { natInit(); } }.start(); messagePumpStarted.block(); - fontList = new String[fontListVec.size()]; - fontListVec.toArray(fontList); - fontListVec = null; - } - - - // Font Handling //////////////////////////////////////////////////////////////////////////// - - // FEATURE: query the registry for the user's default font - protected String _getDefaultFont() { return "dialog8"; } - protected int _getMaxAscent(String font) { return getFont(font).maxAscent; } - protected int _getMaxDescent(String font) { return getFont(font).maxDescent; } - protected native int _stringWidth(String font, String text); - - // methods/members used to enumerate platform fonts on startup - public static Vector fontListVec = new Vector(); - public static String[] fontList = null; - protected String[] _listFonts() { return fontList; } - public static void addFont(String name, int height, boolean italic, boolean bold) { - fontListVec.addElement(name.replace(' ', '_').toLowerCase() + "" + height + (italic ? "i" : "") + (bold ? "b" : "")); - } - - static Hash fontCache = new Hash(); - public static class Win32Font { - int hfont; - int maxAscent; - int maxDescent; - } - - /** Called once XWT is initialized and the application is running. On Win32, we need to block the main thread - * on a semaphore because if the main thread exits, the whole application quits. */ - protected void _running() { - // gcj-win32 exit()'s when the original thread dies, so we have to deadlock ourselves - if (Log.on) Log.log(Main.class, "main thread blocking on new semaphore"); - new org.xwt.util.Semaphore().block(); - } - - /** takes a parsed font and finds the closest platform-specific font */ - static native Win32Font mapFont(Platform.ParsedFont pf); - - /** takes an unparsed font and finds the closest platform-specific font */ - static Win32Font getFont(String font) { - Win32Font ret = (Win32Font)fontCache.get(font); - if (ret != null) return ret; - - Platform.ParsedFont pf = new Platform.ParsedFont(font); - if (pf.name.equals("serif")) pf.name = "Times New Roman"; - else if (pf.name.equals("sansserif")) pf.name = "Arial"; - else if (pf.name.equals("monospace")) pf.name = "Courier New"; - else if (pf.name.equals("dialog")) pf.name = "MS Sans Serif"; - else if (pf.name.equals("tty")) pf.name = "FixedSys"; - - ret = mapFont(pf); - fontCache.put(font, ret); - return ret; } @@ -198,7 +143,7 @@ public class Win32 extends GCJ { // Win32Surface //////////////////////////////////////////////////////////////////////////// - public static class Win32Surface extends Surface { + public static class Win32Surface extends Surface.DoubleBufferedSurface { /** used to block while waiting for the message pump thread to create a hwnd for us */ public Semaphore hwndCreated = new Semaphore(); @@ -249,7 +194,7 @@ public class Win32 extends GCJ { public native void setInvisible(boolean i); public native void _setMaximized(boolean m); public native void setSize(int w, int h); - public native void setLocation(int x, int y); + public native void setLocation(); public native void setTitleBarText(String s); public native void setIcon(Picture p); public native void _dispose(); @@ -318,7 +263,6 @@ public class Win32 extends GCJ { public native void setClip(int x, int y, int x2, int y2); public native void fillRect(int x, int y, int x2, int y2, int color); - public native void drawString(String font, String text, int x, int y, int color); public native void drawPicture(Picture source, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2); public native void finalize(); public void drawPicture(Picture source, int x, int y) { diff --git a/src/org/xwt/plat/X11.cc b/src/org/xwt/plat/X11.cc index b861832..2619244 100644 --- a/src/org/xwt/plat/X11.cc +++ b/src/org/xwt/plat/X11.cc @@ -376,7 +376,7 @@ void org::xwt::plat::X11$X11Surface::setSize (jint width, jint height) { XFlush(display); } -void org::xwt::plat::X11$X11Surface::setLocation (jint x, jint y) { XMoveWindow(display, (*((Window*)window)), x, y); } +void org::xwt::plat::X11$X11Surface::setLocation () { XMoveWindow(display, (*((Window*)window)), root->x, root->y); } void org::xwt::plat::X11$X11Surface::toFront() { XRaiseWindow(display, (*((Window*)window))); } void org::xwt::plat::X11$X11Surface::toBack() { XLowerWindow(display, (*((Window*)window))); } diff --git a/src/org/xwt/plat/X11.java b/src/org/xwt/plat/X11.java index 3b29f4a..5f579e4 100644 --- a/src/org/xwt/plat/X11.java +++ b/src/org/xwt/plat/X11.java @@ -32,7 +32,6 @@ public class X11 extends POSIX { // General Methods /////////////////////////////////////////////////////// protected String _getAltKeyName() { return System.getProperty("os.name", "").indexOf("SunOS") != -1 ? "Meta" : "Alt"; } - protected String[] _listFonts() { return fontList; } protected Picture _createPicture(int[] data, int w, int h) { return new X11Picture(data, w, h); } protected PixelBuffer _createPixelBuffer(int w, int h, Surface owner) { return new X11PixelBuffer(w, h); } @@ -42,9 +41,6 @@ public class X11 extends POSIX { protected native int _getScreenHeight(); protected native String _getClipBoard(); protected native void _setClipBoard(String s); - protected native int _stringWidth(String font, String text); - protected native int _getMaxAscent(String font); - protected native int _getMaxDescent(String font); protected boolean _needsAutoDoubleClick() { return true; } protected native void eventThread(); private native void natInit(); @@ -53,13 +49,12 @@ public class X11 extends POSIX { public void init() { natInit(); (new Thread() { public void run() { eventThread(); } }).start(); - initFonts(); } // X11Surface ///////////////////////////////////////////////////// /** Implements a Surface as an X11 Window */ - public static class X11Surface extends Surface { + public static class X11Surface extends Surface.DoubleBufferedSurface { gnu.gcj.RawData window; gnu.gcj.RawData gc; @@ -72,7 +67,7 @@ public class X11 extends POSIX { public native void _setMinimized(boolean b); public native void setTitleBarText(String s); public native void setSize(int w, int h); - public native void setLocation(int x, int y); + public native void setLocation(); public native void natInit(); public native void toFront(); public native void toBack(); @@ -202,147 +197,8 @@ public class X11 extends POSIX { public int getHeight() { return height; } public native void natInit(); public native void fillRect(int x, int y, int x2, int y2, int color); - public native void drawString(String font, String text, int x, int y, int color); public native void finalize(); } - - // Font Handling //////////////////////////////////////////////////////////////////// - - static String[] fontList = null; - - /** hashtable of all built in X11 fonts; key is XWT font spec, value is X11 font string */ - static Hashtable nativeFontList = new Hashtable(); - - /** cache of all already-looked-up X11 fonts; key is XWT font name, value is a WrappedRawData */ - static Hashtable xwtFontToFontStruct = new Hashtable(); - - /** dumps a list of X11 font strings */ - private native String[] listNativeFonts(); - - /** load native font list */ - public void initFonts() { - // use the font list to build nativeFontList - String[] fonts = listNativeFonts(); - - Vector v = new Vector(); - for(int k=0; k 12) { - if (!font[12].equals("iso8859") && !font[12].equals("")) continue; - if (font.length < 14 || !font[13].equals("1")) continue; - } - - String name = font[1]; - String size = font[6]; - String slant = (font[3].equals("i") || font[3].equals("o")) ? "i" : ""; - String bold = font[2].equals("bold") ? "b" : ""; - String tail = s2.substring(1 + font[0].length() + 1 + font[1].length() + 1 + font[2].length() + 1 + - font[3].length() + 1 + font[4].length() + 1); - - if (bold.equals("*") && slant.equals("*")) { - nativeFontList.put(name + size, font[0] + "-" + font[1] + "-regular-r-" + font[4] + "-" + tail); - nativeFontList.put(name + size + "b", font[0] + "-" + font[1] + "-bold-r-" + font[4] + "-" + tail); - nativeFontList.put(name + size + "i", font[0] + "-" + font[1] + "-regular-i-" + font[4] + "-" + tail); - nativeFontList.put(name + size + "bi", font[0] + "-" + font[1] + "-bold-i-" + font[4] + "-" + tail); - - } else if (bold.equals("*")) { - nativeFontList.put(name + size + slant, font[0] + "-" + font[1] + "-regular-" + font[3] + "-" + font[4] + "-" + tail); - nativeFontList.put(name + size + "b" + slant, font[0] + "-" + font[1] + "-bold-" + font[3] + "-" + font[4] + "-" + tail); - - } else if (slant.equals("*")) { - nativeFontList.put(name + size + bold, font[0] + "-" + font[1] + "-" + font[2] + "-r-" + font[4] + "-" + tail); - nativeFontList.put(name + size + bold + "i", font[0] + "-" + font[1] + "-" + font[2] + "-i-" + font[4] + "-" + tail); - - } else { - nativeFontList.put(name + size + bold + slant, s2); - - } - } catch (ArrayIndexOutOfBoundsException e) { - if (Log.on) Log.log(this, "skipping incomplete font string " + s2); - continue; - } - } - fontList = new String[nativeFontList.size()]; - Enumeration e = nativeFontList.keys(); - for(int i=0; e.hasMoreElements(); i++) fontList[i] = (String)e.nextElement(); - } - - /** so we can put XFontStruct's into Hashtables */ - private static class WrappedRawData { - public RawData wrapee = null; - public WrappedRawData(RawData r) { wrapee = r; } - } - - /** translates an X11 font string into an XFontStruct* */ - public static native gnu.gcj.RawData fontStringToStruct(String s); - - /** translates an XWT font string into an XFontStruct*, performing caching as well */ - public static RawData fontToXFont(String s) { - if (s == null) s = "sansserif"; - s = s.toLowerCase(); - - WrappedRawData wrap = (WrappedRawData)xwtFontToFontStruct.get(s); - if (wrap != null) return wrap.wrapee; - - String bestmatch = ""; - int metric = -1 * Integer.MAX_VALUE; - ParsedFont arg = new ParsedFont(s); - ParsedFont pf = new ParsedFont(); - - if (arg.size == -1) arg.size = 10; - Enumeration e = nativeFontList.keys(); - while(e.hasMoreElements()) { - String jfont = (String)e.nextElement(); - pf.parse(jfont); - int thismetric = 0; - if (!pf.name.equals(arg.name)) { - if (pf.name.equals("lucidabright") && arg.name.equals("serif")) thismetric -= 1000; - else if (pf.name.equals("times") && arg.name.equals("serif")) thismetric -= 2000; - else if (pf.name.equals("helvetica") && arg.name.equals("sansserif")) thismetric -= 1000; - else if (pf.name.equals("courier") && arg.name.equals("monospaced")) thismetric -= 1000; - else if (pf.name.equals("lucida") && arg.name.equals("dialog")) thismetric -= 1000; - else if (pf.name.equals("helvetica") && arg.name.equals("dialog")) thismetric -= 2000; - else if (pf.name.equals("fixed") && arg.name.equals("tty")) thismetric -= 1000; - else if (pf.name.equals("sansserif")) thismetric -= 4000; - else thismetric -= 4004; - } - if (pf.size != 0) thismetric -= Math.abs(pf.size - arg.size) * 4; - if (pf.bold != arg.bold) thismetric -= 1; - if (pf.italic != arg.italic) thismetric -= 1; - if (thismetric > metric) { - metric = thismetric; - bestmatch = jfont; - } - } - - pf.parse(bestmatch); - String target = (String)nativeFontList.get(bestmatch); - if (pf.size == 0) { - int i = 0; - for(int j=0; j<6; j++) i = target.indexOf('-', i + 1); - target = target.substring(0, i + 1) + arg.size + target.substring(target.indexOf('-', i+1)); - } - if (Log.on) Log.log(X11.class, "mapping font \"" + s + "\" to \"" + target + "\""); - RawData ret = fontStringToStruct(target); - if (ret == null) ret = fontStringToStruct("fixed"); - xwtFontToFontStruct.put(s, new WrappedRawData(ret)); - return ret; - } - } diff --git a/src/org/xwt/translators/Font.java b/src/org/xwt/translators/Font.java index 8026108..de71002 100644 --- a/src/org/xwt/translators/Font.java +++ b/src/org/xwt/translators/Font.java @@ -19,8 +19,8 @@ public class Font { InputStream bis = Platform.getBuiltinInputStream(); ZipInputStream zis = new ZipInputStream(bis); - for(ZipEntry ze = zis.getNextEntry(); ze != null && !ze.getName().equals("freetype.mips"); ze = zis.getNextEntry()); - byte[] image = Resources.isToByteArray(zis); + for(ZipEntry ze = zis.getNextEntry(); ze != null && !ze.getName().equals("freetype.mips"); ze = zis.getNextEntry()) { } + byte[] image = InputStreamToByteArray.convert(zis); vm = new org.xwt.mips.Interpreter(image); vm.start(new String[]{ "freetype.mips" }); vm.execute(); @@ -29,7 +29,7 @@ public class Font { int FONT_RESERVED = 256*1024; int baseAddr = vm.sbrk(FONT_RESERVED); - byte[] fontstream = Resources.isToByteArray(res.getInputStream()); + byte[] fontstream = InputStreamToByteArray.convert(res.getInputStream()); vm.copyout(fontstream, baseAddr, fontstream.length); vm.setUserInfo(0, baseAddr); vm.setUserInfo(1, fontstream.length); @@ -49,35 +49,25 @@ public class Font { glyph.advance = vm.getUserInfo(11); glyph.c = (char)g; - gid.width = vm.getUserInfo(6); - gid.height = vm.getUserInfo(7); - if (gid.data == null || gid.data.length < gid.width * gid.height) - gid.data = new int[gid.width * gid.height]; + int width = vm.getUserInfo(6); + int height = vm.getUserInfo(7); + int[] data = new int[width * height]; int addr = vm.getUserInfo(5); - for(int i=0; i= 0; k--) { - if (i + k < gid.width * gid.height) - gid.data[i + k] = (val & 0xff) << 24; + if (i + k < width * height) + data[i + k] = (val & 0xff) << 24; val >>>= 8; } } - glyph.p = Platform.createPicture(gid); + glyph.p = Platform.createPicture(data, width, height); glyphCache.put(res, new Integer((g << 16) | pointsize), glyph); } } catch (Exception e) { Log.log(Font.class, e); } } - - private static GlyphImageDecoder gid = new GlyphImageDecoder(); - private static class GlyphImageDecoder extends ImageDecoder { - int[] data = null; - int width, height; - public int getWidth() { return width; } - public int getHeight() { return height; } - public int[] getData() { return data; } - } } diff --git a/src/org/xwt/translators/GIF.java b/src/org/xwt/translators/GIF.java index b3359f5..4ac420f 100644 --- a/src/org/xwt/translators/GIF.java +++ b/src/org/xwt/translators/GIF.java @@ -51,10 +51,12 @@ import java.io.IOException; import java.io.PrintWriter; /** Converts an InputStream carrying a GIF image into an ARGB int[] */ -public class GIF extends ImageDecoder { +public class GIF { // Public Methods ///////////////////////////////////////////////////////// + public GIF() { } + public int[] getData() { return data; } public int getWidth() { return width; } public int getHeight() { return height; } @@ -62,20 +64,18 @@ public class GIF extends ImageDecoder { /** Processes an image from InputStream is; returns null if there is an error @param name A string describing the image; used for error reporting. */ - public static GIF decode(InputStream is, String name) { + public Picture fromInputStream(InputStream is, String name) { try { - return new GIF(is, name); + if (is instanceof BufferedInputStream) _in = (BufferedInputStream)is; + else _in = new BufferedInputStream(is); + decodeAsBufferedImage(0); + return Platform.createPicture(data, width, height); } catch (Exception e) { if (Log.on) Log.log(GIF.class, e); return null; } } - private GIF(InputStream is, String name) throws IOException { - if (is instanceof BufferedInputStream) _in = (BufferedInputStream)is; - else _in = new BufferedInputStream(is); - decodeAsBufferedImage(0); - } // Private Methods ///////////////////////////////////////////////////////// diff --git a/src/org/xwt/translators/PNG.java b/src/org/xwt/translators/PNG.java index 9e6b8d5..19e382f 100644 --- a/src/org/xwt/translators/PNG.java +++ b/src/org/xwt/translators/PNG.java @@ -22,32 +22,16 @@ import java.util.Enumeration; import java.util.zip.*; /** Converts an InputStream carrying a PNG image into an ARGB int[] */ -public class PNG extends ImageDecoder { +public class PNG { + public PNG() { } + // Public Methods /////////////////////////////////////////////////////////////////////////////// - /** returns the ARGB int[] representing the last image processed */ - public final int[] getData() { return data; } - - /** returns the width of the last image processed */ - public final int getWidth() { return width; } - - /** returns the height of the last image processed */ - public final int getHeight() { return height; } - /** process a PNG as an inputstream; returns null if there is an error @param name A string describing the image, to be used when logging errors */ - public static PNG decode(InputStream is, String name) { - try { - return new PNG(is, name); - } catch (Exception e) { - if (Log.on) Log.log(PNG.class, e); - return null; - } - } - - private PNG(InputStream is, String name) throws IOException { + public Picture fromInputStream(InputStream is, String name) throws IOException { underlyingStream = is; target_offset = 0; inputStream = new DataInputStream(underlyingStream); @@ -58,7 +42,7 @@ public class PNG extends ImageDecoder { Log.log(this, "PNG: error: input file " + name + " is not a PNG file"); data = new int[] { }; width = height = 0; - return; + return null; } DONE: while (!error) { @@ -95,6 +79,8 @@ public class PNG extends ImageDecoder { int crc = inputStream.readInt(); needChunkInfo = true; } + + return Platform.createPicture(data, width, height); } // Chunk Handlers /////////////////////////////////////////////////////////////////////// diff --git a/src/org/xwt/util/InputStreamToByteArray.java b/src/org/xwt/util/InputStreamToByteArray.java new file mode 100644 index 0000000..d2e41c8 --- /dev/null +++ b/src/org/xwt/util/InputStreamToByteArray.java @@ -0,0 +1,28 @@ +package org.xwt.util; +import java.io.*; + +public class InputStreamToByteArray { + + /** scratch space for isToByteArray() */ + private static byte[] workspace = new byte[16 * 1024]; + + /** Trivial method to completely read an InputStream */ + public static synchronized byte[] convert(InputStream is) throws IOException { + int pos = 0; + while (true) { + int numread = is.read(workspace, pos, workspace.length - pos); + if (numread == -1) break; + else if (pos + numread < workspace.length) pos += numread; + else { + pos += numread; + byte[] temp = new byte[workspace.length * 2]; + System.arraycopy(workspace, 0, temp, 0, workspace.length); + workspace = temp; + } + } + byte[] ret = new byte[pos]; + System.arraycopy(workspace, 0, ret, 0, pos); + return ret; + } + +} diff --git a/src/org/xwt/util/Vec.java b/src/org/xwt/util/Vec.java index 70be7d9..723314e 100644 --- a/src/org/xwt/util/Vec.java +++ b/src/org/xwt/util/Vec.java @@ -17,6 +17,7 @@ public final class Vec implements Serializable { public Vec() { this(10); } public Vec(int i) { store = new Object[i]; } + public Vec(int i, Object[] store) { size = i; this.store = store; } private void grow() { grow(store.length * 2); } private void grow(int newsize) { -- 1.7.10.4