From 9ddd30d483456cfbac7c93abe56fc196cb5d19f6 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Mon, 23 May 2005 01:10:22 +0000 Subject: [PATCH] generic_native_drawing_works_but_not_for_mozilla git-svn-id: svn://10.0.0.236/trunk@173697 18797224-902f-48f8-a5cc-f745e15eee43 --- .../CocoaBrowserControlCanvas.java | 23 ++++- mozilla/java/webclient/src_moz/Makefile.in | 2 +- .../src_moz/cocoa/CocoaBrowserControlCanvas.h | 1 + .../cocoa/CocoaBrowserControlCanvas.mm | 93 +++++++++++++++++++ .../cocoa/CocoaBrowserControlCanvasImpl.cpp | 4 + 5 files changed, 121 insertions(+), 2 deletions(-) diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CocoaBrowserControlCanvas.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CocoaBrowserControlCanvas.java index 62ee281b3c6..c373aa38476 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CocoaBrowserControlCanvas.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CocoaBrowserControlCanvas.java @@ -31,7 +31,7 @@ import org.mozilla.webclient.BrowserControlCanvas; import org.mozilla.webclient.impl.wrapper_native.WCRunnable; import org.mozilla.webclient.impl.wrapper_native.NativeEventThread; -import java.awt.Graphics; +import java.awt.*; /** * @@ -45,6 +45,7 @@ public class CocoaBrowserControlCanvas extends BrowserControlCanvas { //New method for obtaining access to the Native Peer handle private native int getHandleToPeer(); + private native void paintMe(Graphics g); /** * Obtain the native window handle for this @@ -63,6 +64,26 @@ public class CocoaBrowserControlCanvas extends BrowserControlCanvas { }); return result.intValue(); } + + public void paint(Graphics g) { + g.setColor(Color.green); + g.fillRect(0, 0, 100, 100); + + g.setColor(Color.blue); + g.fillRect(5, 5, 90, 90); + + // flush any outstanding graphics operations + Toolkit.getDefaultToolkit().sync(); + // Call native code to render third (red) rect + paintMe(g); + + g.setColor(Color.yellow); + g.fillRect(25, 25, 50, 50); + + g.setColor(Color.black); + g.fillRect(40, 40, 20, 20); + } + } diff --git a/mozilla/java/webclient/src_moz/Makefile.in b/mozilla/java/webclient/src_moz/Makefile.in index 68914b7977d..001f04042ea 100644 --- a/mozilla/java/webclient/src_moz/Makefile.in +++ b/mozilla/java/webclient/src_moz/Makefile.in @@ -137,7 +137,7 @@ CMMSRCS = cocoa/CocoaBrowserControlCanvas.mm CPPSRCS += cocoa/CocoaBrowserControlCanvasImpl.cpp DLL_SUFFIX = .jnilib #DSO_LDOPTS += -L/System/Library/Frameworks/JavaVM.Framework/Libraries -ljawt -DSO_LDOPTS += -framework JavaVM -lobjc +DSO_LDOPTS += -framework JavaVM -framework AppKit -lobjc -L../src_share else ifeq ($(OS_ARCH),WINNT) CPPSRCS += \ diff --git a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.h b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.h index 9c895641fcd..d2390913b20 100644 --- a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.h +++ b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.h @@ -31,6 +31,7 @@ class CocoaBrowserControlCanvas { public: static jint cocoaGetHandleToPeer(JNIEnv *env, jobject canvas); + static void paintMe(JNIEnv *env, jobject canvas, jobject graphics); }; diff --git a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.mm b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.mm index 4087fdc3e7c..7b9d491ac84 100644 --- a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.mm +++ b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvas.mm @@ -98,5 +98,98 @@ jint CocoaBrowserControlCanvas::cocoaGetHandleToPeer(JNIEnv *env, jobject canvas // Free the drawing surface (if not caching it) awt.FreeDrawingSurface(ds); +printf("debug: edburns: CocoaBC: winPtr: %p\n", windowPtr); +fflush(stdout); + return (jint) windowPtr; } + + +void CocoaBrowserControlCanvas::paintMe(JNIEnv *env, jobject canvas, jobject graphics) { + + JAWT awt; + JAWT_DrawingSurface* ds = NULL; + JAWT_DrawingSurfaceInfo* dsi = NULL; + JAWT_MacOSXDrawingSurfaceInfo* dsi_mac = NULL; + jboolean result = JNI_FALSE; + jint lock = 0; + jclass bcClass; + jmethodID mid; + + // get the AWT + awt.version = JAWT_VERSION_1_4; + result = JAWT_GetAWT(env, &awt); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + assert(result != JNI_FALSE); + + // Get the drawing surface. This can be safely cached. + // Anything below the DS (DSI, contexts, etc) + // can possibly change/go away and should not be cached. + ds = awt.GetDrawingSurface(env, canvas); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + assert(ds != NULL); + + // Lock the drawing surface + // You must lock EACH TIME before drawing + lock = ds->Lock(ds); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + assert((lock & JAWT_LOCK_ERROR) == 0); + + // Get the drawing surface info + dsi = ds->GetDrawingSurfaceInfo(ds); + + // Check DrawingSurfaceInfo. This can be NULL on Mac OS X + // if the windowing system is not ready + if (dsi != NULL) { + + // Get the platform-specific drawing info + // We will use this to get at Cocoa and CoreGraphics + // See + dsi_mac = (JAWT_MacOSXDrawingSurfaceInfo*)dsi->platformInfo; + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + + // Get the corresponding peer from the caller canvas + NSView *view = dsi_mac->cocoaViewRef; + + // Get the CoreGraphics context from the parent window. + // DO NOT CACHE NSGraphicsContexts -- they may go away. + NSWindow *window = [view window]; + NSGraphicsContext *ctxt = [NSGraphicsContext graphicsContextWithWindow:window]; + CGContextRef cg = [ctxt graphicsPort]; + + // Match Java's ctm + NSRect windowRect = [window frame]; + CGContextConcatCTM(cg, CGAffineTransformMake(1, 0, 0, -1, dsi->bounds.x, windowRect.size.height-dsi->bounds.y)); + + // Draw a pattern using CoreGraphics + CGContextSetRGBFillColor(cg, 1.0f, 0.0f, 0.0f, 1.0f); + CGContextFillRect(cg, CGRectMake(15, 15, dsi->bounds.width-30, dsi->bounds.height-30)); + + // Free the DrawingSurfaceInfo + ds->FreeDrawingSurfaceInfo(dsi); + if (env->ExceptionOccurred()){ + env->ExceptionDescribe(); + } + } + + // Unlock the drawing surface + // You must unlock EACH TIME when done drawing + ds->Unlock(ds); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } + + // Free the drawing surface (if not caching it) + awt.FreeDrawingSurface(ds); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + } +} diff --git a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvasImpl.cpp b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvasImpl.cpp index af525b59ab8..3390d3e3188 100644 --- a/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvasImpl.cpp +++ b/mozilla/java/webclient/src_moz/cocoa/CocoaBrowserControlCanvasImpl.cpp @@ -44,3 +44,7 @@ JNIEXPORT jint JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CocoaBrow result = CocoaBrowserControlCanvas::cocoaGetHandleToPeer(env, canvas); return result; } + +JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_CocoaBrowserControlCanvas_paintMe(JNIEnv *env, jobject canvas, jobject graphics) { + CocoaBrowserControlCanvas::paintMe(env, canvas, graphics); +}