blob: 866d8f41280beda76d987955097134656f203246 [file] [log] [blame]
/*
* Copyright (c) 2004, 2008, 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 OGLContext_h_Included
#define OGLContext_h_Included
#include "sun_java2d_pipe_BufferedContext.h"
#include "sun_java2d_opengl_OGLContext.h"
#include "sun_java2d_opengl_OGLContext_OGLContextCaps.h"
#include "j2d_md.h"
#include "J2D_GL/gl.h"
#include "OGLSurfaceData.h"
/**
* The OGLBlendRule structure encapsulates the two enumerated values that
* comprise a given Porter-Duff blending (compositing) rule. For example,
* the "SrcOver" rule can be represented by:
* rule.src = GL_ONE;
* rule.dst = GL_ONE_MINUS_SRC_ALPHA;
*
* GLenum src;
* The constant representing the source factor in this Porter-Duff rule.
*
* GLenum dst;
* The constant representing the destination factor in this Porter-Duff rule.
*/
typedef struct {
GLenum src;
GLenum dst;
} OGLBlendRule;
/**
* The OGLContext structure contains cached state relevant to the native
* OpenGL context stored within the native ctxInfo field. Each Java-level
* OGLContext object is associated with a native-level OGLContext structure.
* The caps field is a bitfield that expresses the capabilities of the
* GraphicsConfig associated with this context (see OGLContext.java for
* the definitions of each capability bit). The other fields are
* simply cached values of various elements of the context state, typically
* used in the OGLContext.set*() methods.
*
* Note that the textureFunction field is implicitly set to zero when the
* OGLContext is created. The acceptable values (e.g. GL_MODULATE,
* GL_REPLACE) for this field are never zero, which means we will always
* validate the texture function state upon the first call to the
* OGLC_UPDATE_TEXTURE_FUNCTION() macro.
*/
typedef struct {
void *ctxInfo;
jint caps;
jint compState;
jfloat extraAlpha;
jint xorPixel;
jint pixel;
jubyte r;
jubyte g;
jubyte b;
jubyte a;
jint paintState;
jboolean useMask;
GLdouble *xformMatrix;
GLuint blitTextureID;
GLint textureFunction;
} OGLContext;
/**
* See BufferedContext.java for more on these flags...
*/
#define OGLC_NO_CONTEXT_FLAGS \
sun_java2d_pipe_BufferedContext_NO_CONTEXT_FLAGS
#define OGLC_SRC_IS_OPAQUE \
sun_java2d_pipe_BufferedContext_SRC_IS_OPAQUE
#define OGLC_USE_MASK \
sun_java2d_pipe_BufferedContext_USE_MASK
/**
* See OGLContext.java for more on these flags.
*/
#define CAPS_EMPTY \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EMPTY
#define CAPS_RT_PLAIN_ALPHA \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_RT_PLAIN_ALPHA
#define CAPS_RT_TEXTURE_ALPHA \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_RT_TEXTURE_ALPHA
#define CAPS_RT_TEXTURE_OPAQUE \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_RT_TEXTURE_OPAQUE
#define CAPS_MULTITEXTURE \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_MULTITEXTURE
#define CAPS_TEXNONPOW2 \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_TEXNONPOW2
#define CAPS_TEXNONSQUARE \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_TEXNONSQUARE
#define CAPS_PS20 \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_PS20
#define CAPS_PS30 \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_PS30
#define LAST_SHARED_CAP \
sun_java2d_opengl_OGLContext_OGLContextCaps_LAST_SHARED_CAP
#define CAPS_EXT_FBOBJECT \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EXT_FBOBJECT
#define CAPS_STORED_ALPHA \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_STORED_ALPHA
#define CAPS_DOUBLEBUFFERED \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_DOUBLEBUFFERED
#define CAPS_EXT_LCD_SHADER \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EXT_LCD_SHADER
#define CAPS_EXT_BIOP_SHADER \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EXT_BIOP_SHADER
#define CAPS_EXT_GRAD_SHADER \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EXT_GRAD_SHADER
#define CAPS_EXT_TEXRECT \
sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_EXT_TEXRECT
/**
* Evaluates to true if the given capability bitmask is present for the
* given OGLContext. Note that only the constant name needs to be passed as
* a parameter, as this macro will automatically prepend the full package
* and class name to the constant name.
*/
#define OGLC_IS_CAP_PRESENT(oglc, cap) (((oglc)->caps & (cap)) != 0)
/**
* At startup we will embed one of the following values in the caps field
* of OGLContext. Later we can use this information to select
* the codepath that offers the best performance for that vendor's
* hardware and/or drivers.
*/
#define OGLC_VENDOR_OTHER 0
#define OGLC_VENDOR_ATI 1
#define OGLC_VENDOR_NVIDIA 2
#define OGLC_VENDOR_SUN 3
#define OGLC_VCAP_MASK 0x3
#define OGLC_VCAP_OFFSET 24
#define OGLC_GET_VENDOR(oglc) \
(((oglc)->caps >> OGLC_VCAP_OFFSET) & OGLC_VCAP_MASK)
/**
* This constant determines the size of the shared tile texture used
* by a number of image rendering methods. For example, the blit tile texture
* will have dimensions with width OGLC_BLIT_TILE_SIZE and height
* OGLC_BLIT_TILE_SIZE (the tile will always be square).
*/
#define OGLC_BLIT_TILE_SIZE 128
/**
* Helper macros that update the current texture function state only when
* it needs to be changed, which helps reduce overhead for small texturing
* operations. The filter state is set on a per-context (not per-texture)
* basis; for example, if we apply one texture using GL_MODULATE followed by
* another texture using GL_MODULATE (under the same context), there is no
* need to set the texture function the second time, as that would be
* redundant.
*/
#define OGLC_INIT_TEXTURE_FUNCTION(oglc, func) \
do { \
j2d_glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, (func)); \
(oglc)->textureFunction = (func); \
} while (0)
#define OGLC_UPDATE_TEXTURE_FUNCTION(oglc, func) \
do { \
if ((oglc)->textureFunction != (func)) { \
OGLC_INIT_TEXTURE_FUNCTION(oglc, func); \
} \
} while (0)
/**
* Exported methods.
*/
OGLContext *OGLContext_SetSurfaces(JNIEnv *env, jlong pSrc, jlong pDst);
void OGLContext_ResetClip(OGLContext *oglc);
void OGLContext_SetRectClip(OGLContext *oglc, OGLSDOps *dstOps,
jint x1, jint y1, jint x2, jint y2);
void OGLContext_BeginShapeClip(OGLContext *oglc);
void OGLContext_EndShapeClip(OGLContext *oglc, OGLSDOps *dstOps);
void OGLContext_SetExtraAlpha(jfloat ea);
void OGLContext_ResetComposite(OGLContext *oglc);
void OGLContext_SetAlphaComposite(OGLContext *oglc,
jint rule, jfloat extraAlpha, jint flags);
void OGLContext_SetXorComposite(OGLContext *oglc, jint xorPixel);
void OGLContext_ResetTransform(OGLContext *oglc);
void OGLContext_SetTransform(OGLContext *oglc,
jdouble m00, jdouble m10,
jdouble m01, jdouble m11,
jdouble m02, jdouble m12);
jboolean OGLContext_InitBlitTileTexture(OGLContext *oglc);
GLuint OGLContext_CreateBlitTexture(GLenum internalFormat, GLenum pixelFormat,
GLuint width, GLuint height);
void OGLContext_DestroyContextResources(OGLContext *oglc);
jboolean OGLContext_IsExtensionAvailable(const char *extString, char *extName);
void OGLContext_GetExtensionInfo(JNIEnv *env, jint *caps);
jboolean OGLContext_IsVersionSupported(const unsigned char *versionstr);
GLhandleARB OGLContext_CreateFragmentProgram(const char *fragmentShaderSource);
#endif /* OGLContext_h_Included */