Sasha Smundak | 625f86b | 2019-10-04 16:15:03 -0700 | [diff] [blame] | 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_ */ |