• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * %W% %E%
3  *
4  * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
5  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
6  */
7 
8 #ifndef _JAVASOFT_JAWT_H_
9 #define _JAVASOFT_JAWT_H_
10 
11 #include "jni.h"
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 /*
18  * AWT native interface (new in JDK 1.3)
19  *
20  * The AWT native interface allows a native C or C++ application a means
21  * by which to access native structures in AWT.  This is to facilitate moving
22  * legacy C and C++ applications to Java and to target the needs of the
23  * community who, at present, wish to do their own native rendering to canvases
24  * for performance reasons.  Standard extensions such as Java3D also require a
25  * means to access the underlying native data structures of AWT.
26  *
27  * There may be future extensions to this API depending on demand.
28  *
29  * A VM does not have to implement this API in order to pass the JCK.
30  * It is recommended, however, that this API is implemented on VMs that support
31  * standard extensions, such as Java3D.
32  *
33  * Since this is a native API, any program which uses it cannot be considered
34  * 100% pure java.
35  */
36 
37 /*
38  * AWT Native Drawing Surface (JAWT_DrawingSurface).
39  *
40  * For each platform, there is a native drawing surface structure.  This
41  * platform-specific structure can be found in jawt_md.h.  It is recommended
42  * that additional platforms follow the same model.  It is also recommended
43  * that VMs on Win32 and Solaris support the existing structures in jawt_md.h.
44  *
45  *******************
46  * EXAMPLE OF USAGE:
47  *******************
48  *
49  * In Win32, a programmer wishes to access the HWND of a canvas to perform
50  * native rendering into it.  The programmer has declared the paint() method
51  * for their canvas subclass to be native:
52  *
53  *
54  * MyCanvas.java:
55  *
56  * import java.awt.*;
57  *
58  * public class MyCanvas extends Canvas {
59  *
60  *     static {
61  *         System.loadLibrary("mylib");
62  *     }
63  *
64  *     public native void paint(Graphics g);
65  * }
66  *
67  *
68  * myfile.c:
69  *
70  * #include "jawt_md.h"
71  * #include <assert.h>
72  *
73  * JNIEXPORT void JNICALL
74  * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics)
75  * {
76  *     JAWT awt;
77  *     JAWT_DrawingSurface* ds;
78  *     JAWT_DrawingSurfaceInfo* dsi;
79  *     JAWT_Win32DrawingSurfaceInfo* dsi_win;
80  *     jboolean result;
81  *     jint lock;
82  *
83  *     // Get the AWT
84  *     awt.version = JAWT_VERSION_1_3;
85  *     result = JAWT_GetAWT(env, &awt);
86  *     assert(result != JNI_FALSE);
87  *
88  *     // Get the drawing surface
89  *     ds = awt.GetDrawingSurface(env, canvas);
90  *     assert(ds != NULL);
91  *
92  *     // Lock the drawing surface
93  *     lock = ds->Lock(ds);
94  *     assert((lock & JAWT_LOCK_ERROR) == 0);
95  *
96  *     // Get the drawing surface info
97  *     dsi = ds->GetDrawingSurfaceInfo(ds);
98  *
99  *     // Get the platform-specific drawing info
100  *     dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
101  *
102  *     //////////////////////////////
103  *     // !!! DO PAINTING HERE !!! //
104  *     //////////////////////////////
105  *
106  *     // Free the drawing surface info
107  *     ds->FreeDrawingSurfaceInfo(dsi);
108  *
109  *     // Unlock the drawing surface
110  *     ds->Unlock(ds);
111  *
112  *     // Free the drawing surface
113  *     awt.FreeDrawingSurface(ds);
114  * }
115  *
116  */
117 
118 /*
119  * JAWT_Rectangle
120  * Structure for a native rectangle.
121  */
122 typedef struct jawt_Rectangle {
123     jint x;
124     jint y;
125     jint width;
126     jint height;
127 } JAWT_Rectangle;
128 
129 struct jawt_DrawingSurface;
130 
131 /*
132  * JAWT_DrawingSurfaceInfo
133  * Structure for containing the underlying drawing information of a component.
134  */
135 typedef struct jawt_DrawingSurfaceInfo {
136     /*
137      * Pointer to the platform-specific information.  This can be safely
138      * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a
139      * JAWT_X11DrawingSurfaceInfo on Solaris.  See jawt_md.h for details.
140      */
141     void* platformInfo;
142     /* Cached pointer to the underlying drawing surface */
143     struct jawt_DrawingSurface* ds;
144     /* Bounding rectangle of the drawing surface */
145     JAWT_Rectangle bounds;
146     /* Number of rectangles in the clip */
147     jint clipSize;
148     /* Clip rectangle array */
149     JAWT_Rectangle* clip;
150 } JAWT_DrawingSurfaceInfo;
151 
152 #define JAWT_LOCK_ERROR                 0x00000001
153 #define JAWT_LOCK_CLIP_CHANGED          0x00000002
154 #define JAWT_LOCK_BOUNDS_CHANGED        0x00000004
155 #define JAWT_LOCK_SURFACE_CHANGED       0x00000008
156 
157 /*
158  * JAWT_DrawingSurface
159  * Structure for containing the underlying drawing information of a component.
160  * All operations on a JAWT_DrawingSurface MUST be performed from the same
161  * thread as the call to GetDrawingSurface.
162  */
163 typedef struct jawt_DrawingSurface {
164     /*
165      * Cached reference to the Java environment of the calling thread.
166      * If Lock(), Unlock(), GetDrawingSurfaceInfo() or
167      * FreeDrawingSurfaceInfo() are called from a different thread,
168      * this data member should be set before calling those functions.
169      */
170     JNIEnv* env;
171     /* Cached reference to the target object */
172     jobject target;
173     /*
174      * Lock the surface of the target component for native rendering.
175      * When finished drawing, the surface must be unlocked with
176      * Unlock().  This function returns a bitmask with one or more of the
177      * following values:
178      *
179      * JAWT_LOCK_ERROR - When an error has occurred and the surface could not
180      * be locked.
181      *
182      * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed.
183      *
184      * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed.
185      *
186      * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed
187      */
188     jint (JNICALL *Lock)
189         (struct jawt_DrawingSurface* ds);
190     /*
191      * Get the drawing surface info.
192      * The value returned may be cached, but the values may change if
193      * additional calls to Lock() or Unlock() are made.
194      * Lock() must be called before this can return a valid value.
195      * Returns NULL if an error has occurred.
196      * When finished with the returned value, FreeDrawingSurfaceInfo must be
197      * called.
198      */
199     JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo)
200         (struct jawt_DrawingSurface* ds);
201     /*
202      * Free the drawing surface info.
203      */
204     void (JNICALL *FreeDrawingSurfaceInfo)
205         (JAWT_DrawingSurfaceInfo* dsi);
206     /*
207      * Unlock the drawing surface of the target component for native rendering.
208      */
209     void (JNICALL *Unlock)
210         (struct jawt_DrawingSurface* ds);
211 } JAWT_DrawingSurface;
212 
213 /*
214  * JAWT
215  * Structure for containing native AWT functions.
216  */
217 typedef struct jawt {
218     /*
219      * Version of this structure.  This must always be set before
220      * calling JAWT_GetAWT()
221      */
222     jint version;
223     /*
224      * Return a drawing surface from a target jobject.  This value
225      * may be cached.
226      * Returns NULL if an error has occurred.
227      * Target must be a java.awt.Component (should be a Canvas
228      * or Window for native rendering).
229      * FreeDrawingSurface() must be called when finished with the
230      * returned JAWT_DrawingSurface.
231      */
232     JAWT_DrawingSurface* (JNICALL *GetDrawingSurface)
233         (JNIEnv* env, jobject target);
234     /*
235      * Free the drawing surface allocated in GetDrawingSurface.
236      */
237     void (JNICALL *FreeDrawingSurface)
238         (JAWT_DrawingSurface* ds);
239     /*
240      * Since 1.4
241      * Locks the entire AWT for synchronization purposes
242      */
243     void (JNICALL *Lock)(JNIEnv* env);
244     /*
245      * Since 1.4
246      * Unlocks the entire AWT for synchronization purposes
247      */
248     void (JNICALL *Unlock)(JNIEnv* env);
249     /*
250      * Since 1.4
251      * Returns a reference to a java.awt.Component from a native
252      * platform handle.  On Windows, this corresponds to an HWND;
253      * on Solaris and Linux, this is a Drawable.  For other platforms,
254      * see the appropriate machine-dependent header file for a description.
255      * The reference returned by this function is a local
256      * reference that is only valid in this environment.
257      * This function returns a NULL reference if no component could be
258      * found with matching platform information.
259      */
260     jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo);
261 
262 } JAWT;
263 
264 /*
265  * Get the AWT native structure.  This function returns JNI_FALSE if
266  * an error occurs.
267  */
268 _JNI_IMPORT_OR_EXPORT_
269 jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt);
270 
271 #define JAWT_VERSION_1_3 0x00010003
272 #define JAWT_VERSION_1_4 0x00010004
273 
274 #ifdef __cplusplus
275 } /* extern "C" */
276 #endif
277 
278 #endif /* !_JAVASOFT_JAWT_H_ */
279