1 | /* |
2 | * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. Oracle designates this |
8 | * particular file as subject to the "Classpath" exception as provided |
9 | * by Oracle in the LICENSE file that accompanied this code. |
10 | * |
11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | * version 2 for more details (a copy is included in the LICENSE file that |
15 | * accompanied this code). |
16 | * |
17 | * You should have received a copy of the GNU General Public License version |
18 | * 2 along with this work; if not, write to the Free Software Foundation, |
19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
20 | * |
21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 | * or visit www.oracle.com if you need additional information or have any |
23 | * questions. |
24 | */ |
25 | |
26 | #ifndef _JAVASOFT_JAWT_H_ |
27 | #define _JAVASOFT_JAWT_H_ |
28 | |
29 | #include "jni.h" |
30 | |
31 | #ifdef __cplusplus |
32 | extern "C" { |
33 | #endif |
34 | |
35 | /* |
36 | * AWT native interface. |
37 | * |
38 | * The AWT native interface allows a native C or C++ application a means |
39 | * by which to access native structures in AWT. This is to facilitate moving |
40 | * legacy C and C++ applications to Java and to target the needs of the |
41 | * developers who need to do their own native rendering to canvases |
42 | * for performance or other reasons. |
43 | * |
44 | * Conversely it also provides mechanisms for an application which already |
45 | * has a native window to provide that to AWT for AWT rendering. |
46 | * |
47 | * Since every platform may be different in its native data structures |
48 | * and APIs for windowing systems the application must necessarily |
49 | * provided per-platform source and compile and deliver per-platform |
50 | * native code to use this API. |
51 | * |
52 | * These interfaces are not part of the Java SE specification and |
53 | * a VM is not required to implement this API. However it is strongly |
54 | * recommended that all implementations which support headful AWT |
55 | * also support these interfaces. |
56 | * |
57 | */ |
58 | |
59 | /* |
60 | * AWT Native Drawing Surface (JAWT_DrawingSurface). |
61 | * |
62 | * For each platform, there is a native drawing surface structure. This |
63 | * platform-specific structure can be found in jawt_md.h. It is recommended |
64 | * that additional platforms follow the same model. It is also recommended |
65 | * that VMs on all platforms support the existing structures in jawt_md.h. |
66 | * |
67 | ******************* |
68 | * EXAMPLE OF USAGE: |
69 | ******************* |
70 | * |
71 | * In Win32, a programmer wishes to access the HWND of a canvas to perform |
72 | * native rendering into it. The programmer has declared the paint() method |
73 | * for their canvas subclass to be native: |
74 | * |
75 | * |
76 | * MyCanvas.java: |
77 | * |
78 | * import java.awt.*; |
79 | * |
80 | * public class MyCanvas extends Canvas { |
81 | * |
82 | * static { |
83 | * System.loadLibrary("mylib"); |
84 | * } |
85 | * |
86 | * public native void paint(Graphics g); |
87 | * } |
88 | * |
89 | * |
90 | * myfile.c: |
91 | * |
92 | * #include "jawt_md.h" |
93 | * #include <assert.h> |
94 | * |
95 | * JNIEXPORT void JNICALL |
96 | * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics) |
97 | * { |
98 | * JAWT awt; |
99 | * JAWT_DrawingSurface* ds; |
100 | * JAWT_DrawingSurfaceInfo* dsi; |
101 | * JAWT_Win32DrawingSurfaceInfo* dsi_win; |
102 | * jboolean result; |
103 | * jint lock; |
104 | * |
105 | * // Get the AWT. Request version 9 to access features in that release. |
106 | * awt.version = JAWT_VERSION_9; |
107 | * result = JAWT_GetAWT(env, &awt); |
108 | * assert(result != JNI_FALSE); |
109 | * |
110 | * // Get the drawing surface |
111 | * ds = awt.GetDrawingSurface(env, canvas); |
112 | * assert(ds != NULL); |
113 | * |
114 | * // Lock the drawing surface |
115 | * lock = ds->Lock(ds); |
116 | * assert((lock & JAWT_LOCK_ERROR) == 0); |
117 | * |
118 | * // Get the drawing surface info |
119 | * dsi = ds->GetDrawingSurfaceInfo(ds); |
120 | * |
121 | * // Get the platform-specific drawing info |
122 | * dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo; |
123 | * |
124 | * ////////////////////////////// |
125 | * // !!! DO PAINTING HERE !!! // |
126 | * ////////////////////////////// |
127 | * |
128 | * // Free the drawing surface info |
129 | * ds->FreeDrawingSurfaceInfo(dsi); |
130 | * |
131 | * // Unlock the drawing surface |
132 | * ds->Unlock(ds); |
133 | * |
134 | * // Free the drawing surface |
135 | * awt.FreeDrawingSurface(ds); |
136 | * } |
137 | * |
138 | */ |
139 | |
140 | /* |
141 | * JAWT_Rectangle |
142 | * Structure for a native rectangle. |
143 | */ |
144 | typedef struct jawt_Rectangle { |
145 | jint x; |
146 | jint y; |
147 | jint width; |
148 | jint height; |
149 | } JAWT_Rectangle; |
150 | |
151 | struct jawt_DrawingSurface; |
152 | |
153 | /* |
154 | * JAWT_DrawingSurfaceInfo |
155 | * Structure for containing the underlying drawing information of a component. |
156 | */ |
157 | typedef struct jawt_DrawingSurfaceInfo { |
158 | /* |
159 | * Pointer to the platform-specific information. This can be safely |
160 | * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a |
161 | * JAWT_X11DrawingSurfaceInfo on Linux and Solaris. On Mac OS X this is a |
162 | * pointer to a NSObject that conforms to the JAWT_SurfaceLayers |
163 | * protocol. See jawt_md.h for details. |
164 | */ |
165 | void* platformInfo; |
166 | /* Cached pointer to the underlying drawing surface */ |
167 | struct jawt_DrawingSurface* ds; |
168 | /* Bounding rectangle of the drawing surface */ |
169 | JAWT_Rectangle bounds; |
170 | /* Number of rectangles in the clip */ |
171 | jint clipSize; |
172 | /* Clip rectangle array */ |
173 | JAWT_Rectangle* clip; |
174 | } JAWT_DrawingSurfaceInfo; |
175 | |
176 | #define JAWT_LOCK_ERROR 0x00000001 |
177 | #define JAWT_LOCK_CLIP_CHANGED 0x00000002 |
178 | #define JAWT_LOCK_BOUNDS_CHANGED 0x00000004 |
179 | #define JAWT_LOCK_SURFACE_CHANGED 0x00000008 |
180 | |
181 | /* |
182 | * JAWT_DrawingSurface |
183 | * Structure for containing the underlying drawing information of a component. |
184 | * All operations on a JAWT_DrawingSurface MUST be performed from the same |
185 | * thread as the call to GetDrawingSurface. |
186 | */ |
187 | typedef struct jawt_DrawingSurface { |
188 | /* |
189 | * Cached reference to the Java environment of the calling thread. |
190 | * If Lock(), Unlock(), GetDrawingSurfaceInfo() or |
191 | * FreeDrawingSurfaceInfo() are called from a different thread, |
192 | * this data member should be set before calling those functions. |
193 | */ |
194 | JNIEnv* env; |
195 | /* Cached reference to the target object */ |
196 | jobject target; |
197 | /* |
198 | * Lock the surface of the target component for native rendering. |
199 | * When finished drawing, the surface must be unlocked with |
200 | * Unlock(). This function returns a bitmask with one or more of the |
201 | * following values: |
202 | * |
203 | * JAWT_LOCK_ERROR - When an error has occurred and the surface could not |
204 | * be locked. |
205 | * |
206 | * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed. |
207 | * |
208 | * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed. |
209 | * |
210 | * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed |
211 | */ |
212 | jint (JNICALL *Lock) |
213 | (struct jawt_DrawingSurface* ds); |
214 | /* |
215 | * Get the drawing surface info. |
216 | * The value returned may be cached, but the values may change if |
217 | * additional calls to Lock() or Unlock() are made. |
218 | * Lock() must be called before this can return a valid value. |
219 | * Returns NULL if an error has occurred. |
220 | * When finished with the returned value, FreeDrawingSurfaceInfo must be |
221 | * called. |
222 | */ |
223 | JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo) |
224 | (struct jawt_DrawingSurface* ds); |
225 | /* |
226 | * Free the drawing surface info. |
227 | */ |
228 | void (JNICALL *FreeDrawingSurfaceInfo) |
229 | (JAWT_DrawingSurfaceInfo* dsi); |
230 | /* |
231 | * Unlock the drawing surface of the target component for native rendering. |
232 | */ |
233 | void (JNICALL *Unlock) |
234 | (struct jawt_DrawingSurface* ds); |
235 | } JAWT_DrawingSurface; |
236 | |
237 | /* |
238 | * JAWT |
239 | * Structure for containing native AWT functions. |
240 | */ |
241 | typedef struct jawt { |
242 | /* |
243 | * Version of this structure. This must always be set before |
244 | * calling JAWT_GetAWT(). It affects the functions returned. |
245 | * Must be one of the known pre-defined versions. |
246 | */ |
247 | jint version; |
248 | /* |
249 | * Return a drawing surface from a target jobject. This value |
250 | * may be cached. |
251 | * Returns NULL if an error has occurred. |
252 | * Target must be a java.awt.Component (should be a Canvas |
253 | * or Window for native rendering). |
254 | * FreeDrawingSurface() must be called when finished with the |
255 | * returned JAWT_DrawingSurface. |
256 | */ |
257 | JAWT_DrawingSurface* (JNICALL *GetDrawingSurface) |
258 | (JNIEnv* env, jobject target); |
259 | /* |
260 | * Free the drawing surface allocated in GetDrawingSurface. |
261 | */ |
262 | void (JNICALL *FreeDrawingSurface) |
263 | (JAWT_DrawingSurface* ds); |
264 | /* |
265 | * Since 1.4 |
266 | * Locks the entire AWT for synchronization purposes |
267 | */ |
268 | void (JNICALL *Lock)(JNIEnv* env); |
269 | /* |
270 | * Since 1.4 |
271 | * Unlocks the entire AWT for synchronization purposes |
272 | */ |
273 | void (JNICALL *Unlock)(JNIEnv* env); |
274 | /* |
275 | * Since 1.4 |
276 | * Returns a reference to a java.awt.Component from a native |
277 | * platform handle. On Windows, this corresponds to an HWND; |
278 | * on Solaris and Linux, this is a Drawable. For other platforms, |
279 | * see the appropriate machine-dependent header file for a description. |
280 | * The reference returned by this function is a local |
281 | * reference that is only valid in this environment. |
282 | * This function returns a NULL reference if no component could be |
283 | * found with matching platform information. |
284 | */ |
285 | jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo); |
286 | |
287 | /** |
288 | * Since 9 |
289 | * Creates a java.awt.Frame placed in a native container. Container is |
290 | * referenced by the native platform handle. For example on Windows this |
291 | * corresponds to an HWND. For other platforms, see the appropriate |
292 | * machine-dependent header file for a description. The reference returned |
293 | * by this function is a local reference that is only valid in this |
294 | * environment. This function returns a NULL reference if no frame could be |
295 | * created with matching platform information. |
296 | */ |
297 | jobject (JNICALL *CreateEmbeddedFrame) (JNIEnv *env, void* platformInfo); |
298 | |
299 | /** |
300 | * Since 9 |
301 | * Moves and resizes the embedded frame. The new location of the top-left |
302 | * corner is specified by x and y parameters relative to the native parent |
303 | * component. The new size is specified by width and height. |
304 | * |
305 | * The embedded frame should be created by CreateEmbeddedFrame() method, or |
306 | * this function will not have any effect. |
307 | * |
308 | * java.awt.Component.setLocation() and java.awt.Component.setBounds() for |
309 | * EmbeddedFrame really don't move it within the native parent. These |
310 | * methods always locate the embedded frame at (0, 0) for backward |
311 | * compatibility. To allow moving embedded frames this method was |
312 | * introduced, and it works just the same way as setLocation() and |
313 | * setBounds() for usual, non-embedded components. |
314 | * |
315 | * Using usual get/setLocation() and get/setBounds() together with this new |
316 | * method is not recommended. |
317 | */ |
318 | void (JNICALL *SetBounds) (JNIEnv *env, jobject embeddedFrame, |
319 | jint x, jint y, jint w, jint h); |
320 | /** |
321 | * Since 9 |
322 | * Synthesize a native message to activate or deactivate an EmbeddedFrame |
323 | * window depending on the value of parameter doActivate, if "true" |
324 | * activates the window; otherwise, deactivates the window. |
325 | * |
326 | * The embedded frame should be created by CreateEmbeddedFrame() method, or |
327 | * this function will not have any effect. |
328 | */ |
329 | void (JNICALL *SynthesizeWindowActivation) (JNIEnv *env, |
330 | jobject embeddedFrame, jboolean doActivate); |
331 | } JAWT; |
332 | |
333 | /* |
334 | * Get the AWT native structure. This function returns JNI_FALSE if |
335 | * an error occurs. |
336 | */ |
337 | _JNI_IMPORT_OR_EXPORT_ |
338 | jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt); |
339 | |
340 | /* |
341 | * Specify one of these constants as the JAWT.version |
342 | * Specifying an earlier version will limit the available functions to |
343 | * those provided in that earlier version of JAWT. |
344 | * See the "Since" note on each API. Methods with no "Since" |
345 | * may be presumed to be present in JAWT_VERSION_1_3. |
346 | */ |
347 | #define JAWT_VERSION_1_3 0x00010003 |
348 | #define JAWT_VERSION_1_4 0x00010004 |
349 | #define JAWT_VERSION_1_7 0x00010007 |
350 | #define JAWT_VERSION_9 0x00090000 |
351 | |
352 | #ifdef __cplusplus |
353 | } /* extern "C" */ |
354 | #endif |
355 | |
356 | #endif /* !_JAVASOFT_JAWT_H_ */ |
357 | |