| /* |
| * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| #ifndef _WIN32SURFACEDATA_H_ |
| #define _WIN32SURFACEDATA_H_ |
| |
| |
| #include "SurfaceData.h" |
| |
| #include "colordata.h" |
| #include "awt_Brush.h" |
| #include "awt_Pen.h" |
| #include "awt_Win32GraphicsDevice.h" |
| |
| #include "stdhdrs.h" |
| |
| |
| #define TEST_SURFACE_BITS(a,f) (((a)&(f)) == (f)) |
| |
| /** |
| * This include file contains support definitions for loops using the |
| * SurfaceData interface to talk to a Win32 drawable from native code. |
| */ |
| |
| typedef struct _GDIWinSDOps GDIWinSDOps; |
| |
| #define CONTEXT_NORMAL 0 |
| #define CONTEXT_DISPLAY_CHANGE 1 |
| #define CONTEXT_ENTER_FULL_SCREEN 2 |
| #define CONTEXT_CHANGE_BUFFER_COUNT 3 |
| #define CONTEXT_EXIT_FULL_SCREEN 4 |
| |
| /* |
| * The definitions of the various attribute flags for requesting |
| * which rendering objects should be selected into the HDC returned |
| * from GetDC(). |
| */ |
| #define PEN 1 |
| #define NOPEN 2 |
| #define BRUSH 4 |
| #define NOBRUSH 8 |
| #define CLIP 16 /* For tracking purposes only */ |
| #define PENBRUSH (PEN | BRUSH) |
| #define PENONLY (PEN | NOBRUSH) |
| #define BRUSHONLY (BRUSH | NOPEN) |
| |
| /* |
| * This function retrieves an HDC for rendering to the destination |
| * managed by the indicated GDIWinSDOps structure. |
| * |
| * The env parameter should be the JNIEnv of the surrounding JNI context. |
| * |
| * The ops parameter should be a pointer to the ops object upon which |
| * this function is being invoked. |
| * |
| * The flags parameter should be an inclusive OR of any of the attribute |
| * flags defined above. |
| * |
| * The patrop parameter should be a pointer to a jint that will receive |
| * the appropriate ROP code (PATCOPY or PATINVERT) based on the current |
| * composite, or NULL if the ROP code will be ignored by the caller. |
| * |
| * The clip parameter should be a pointer to a rectangle indicating the |
| * desired clip. |
| * |
| * The comp parameter should be a pointer to a Composite object, or NULL |
| * which means the Src (default) compositing rule will be used. |
| * |
| * The pixel parameter should be a 24-bit XRGB value indicating the |
| * color that will be used for rendering. The upper 8 bits are allowed |
| * to be any value. |
| * |
| * The ReleaseDC function should be called to release the lock on the DC |
| * after a given atomic set of rendering operations is complete. |
| * |
| * Note to callers: |
| * This function may use JNI methods so it is important that the |
| * caller not have any outstanding GetPrimitiveArrayCritical or |
| * GetStringCritical locks which have not been released. |
| */ |
| typedef HDC GetDCFunc(JNIEnv *env, |
| GDIWinSDOps *wsdo, |
| jint flags, |
| jint *patrop, |
| jobject clip, |
| jobject comp, |
| jint color); |
| |
| /* |
| * This function releases an HDC that was retrieved from the GetDC |
| * function of the indicated GDIWinSDOps structure. |
| * |
| * The env parameter should be the JNIEnv of the surrounding JNI context. |
| * |
| * The ops parameter should be a pointer to the ops object upon which |
| * this function is being invoked. |
| * |
| * The hdc parameter should be the handle to the HDC object that was |
| * returned from the GetDC function. |
| * |
| * Note to callers: |
| * This function may use JNI methods so it is important that the |
| * caller not have any outstanding GetPrimitiveArrayCritical or |
| * GetStringCritical locks which have not been released. |
| */ |
| typedef void ReleaseDCFunc(JNIEnv *env, |
| GDIWinSDOps *wsdo, |
| HDC hdc); |
| |
| |
| typedef void InvalidateSDFunc(JNIEnv *env, |
| GDIWinSDOps *wsdo); |
| |
| /* |
| * A structure that holds all state global to the native surfaceData |
| * object. |
| * |
| * Note: |
| * This structure will be shared between different threads that |
| * operate on the same surfaceData, so it should not contain any |
| * variables that could be changed by one thread thus placing other |
| * threads in a state of confusion. For example, the hDC field was |
| * removed because each thread now has its own shared DC. But the |
| * window field remains because once it is set for a given wsdo |
| * structure it stays the same until that structure is destroyed. |
| */ |
| struct _GDIWinSDOps { |
| SurfaceDataOps sdOps; |
| LONG timeStamp; // creation time stamp. |
| // Doesn't store a real time - |
| // just counts creation events of this structure |
| // made by GDIWindowSurfaceData_initOps() |
| // see bug# 6859086 |
| jboolean invalid; |
| GetDCFunc *GetDC; |
| ReleaseDCFunc *ReleaseDC; |
| InvalidateSDFunc *InvalidateSD; |
| jint lockType; // REMIND: store in TLS |
| jint lockFlags; // REMIND: store in TLS |
| jobject peer; |
| HWND window; |
| RECT insets; |
| jint depth; |
| jint pixelStride; // Bytes per pixel |
| DWORD pixelMasks[3]; // RGB Masks for Windows DIB creation |
| HBITMAP bitmap; // REMIND: store in TLS |
| HBITMAP oldmap; // REMIND: store in TLS |
| HDC bmdc; // REMIND: store in TLS |
| int bmScanStride; // REMIND: store in TLS |
| int bmWidth; // REMIND: store in TLS |
| int bmHeight; // REMIND: store in TLS |
| void *bmBuffer; // REMIND: store in TLS |
| jboolean bmCopyToScreen; // Used to track whether we |
| // actually should copy the bitmap |
| // to the screen |
| AwtBrush *brush; // used for offscreen surfaces only |
| jint brushclr; |
| AwtPen *pen; // used for offscreen surfaces only |
| jint penclr; |
| |
| int x, y, w, h; // REMIND: store in TLS |
| CriticalSection *surfaceLock; // REMIND: try to remove |
| AwtWin32GraphicsDevice *device; |
| }; |
| |
| #define WIN32SD_LOCK_UNLOCKED 0 /* surface is not locked */ |
| #define WIN32SD_LOCK_BY_NULL 1 /* surface locked for NOP */ |
| #define WIN32SD_LOCK_BY_DIB 2 /* surface locked by BitBlt */ |
| |
| extern "C" { |
| |
| /* |
| * Structure for holding the graphics state of a thread. |
| */ |
| typedef struct { |
| HDC hDC; |
| HWND hWnd; |
| GDIWinSDOps *wsdo; |
| LONG wsdoTimeStamp; // wsdo creation time stamp. |
| // Other threads may deallocate wsdo |
| // and then allocate a new GDIWinSDOps |
| // structure at the same memory location. |
| // Time stamp is the only way to detect if |
| // wsdo got changed. |
| // see bug# 6859086 |
| RECT bounds; |
| jobject clip; |
| jobject comp; |
| jint xorcolor; |
| jint patrop; |
| jint type; |
| AwtBrush *brush; |
| jint brushclr; |
| AwtPen *pen; |
| jint penclr; |
| } ThreadGraphicsInfo; |
| |
| |
| /* |
| * This function returns a pointer to a native GDIWinSDOps structure |
| * for accessing the indicated Win32 SurfaceData Java object. It |
| * verifies that the indicated SurfaceData object is an instance |
| * of GDIWindowSurfaceData before returning and will return NULL if the |
| * wrong SurfaceData object is being accessed. This function will |
| * throw the appropriate Java exception if it returns NULL so that |
| * the caller can simply return. |
| * |
| * Note to callers: |
| * This function uses JNI methods so it is important that the |
| * caller not have any outstanding GetPrimitiveArrayCritical or |
| * GetStringCritical locks which have not been released. |
| * |
| * The caller may continue to use JNI methods after this method |
| * is called since this function will not leave any outstanding |
| * JNI Critical locks unreleased. |
| */ |
| JNIEXPORT GDIWinSDOps * JNICALL |
| GDIWindowSurfaceData_GetOps(JNIEnv *env, jobject sData); |
| |
| JNIEXPORT GDIWinSDOps * JNICALL |
| GDIWindowSurfaceData_GetOpsNoSetup(JNIEnv *env, jobject sData); |
| |
| JNIEXPORT HWND JNICALL |
| GDIWindowSurfaceData_GetWindow(JNIEnv *env, GDIWinSDOps *wsdo); |
| |
| JNIEXPORT void JNICALL |
| GDIWinSD_InitDC(JNIEnv *env, GDIWinSDOps *wsdo, ThreadGraphicsInfo *info, |
| jint type, jint *patrop, |
| jobject clip, jobject comp, jint color); |
| |
| JNIEXPORT AwtComponent * JNICALL |
| GDIWindowSurfaceData_GetComp(JNIEnv *env, GDIWinSDOps *wsdo); |
| |
| } /* extern "C" */ |
| |
| |
| #endif _WIN32SURFACEDATA_H_ |