jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c
author bae
Mon, 30 May 2011 12:05:22 +0400
changeset 9760 5c5883cf6c96
parent 9050 26c2c1de1631
child 12389 51f9d419c9e4
permissions -rw-r--r--
7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64 Reviewed-by: prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     1
/*
9035
1255eb81cc2f 7033660: Update copyright year to 2011 on any files changed in 2011
ohair
parents: 8506
diff changeset
     2
 * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     4
 *
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6374
e214162c907e 6982137: Rebranding pass 2 - missed copyright changes
ohair
parents: 5579
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
6374
e214162c907e 6982137: Rebranding pass 2 - missed copyright changes
ohair
parents: 5579
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    10
 *
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    15
 * accompanied this code).
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    16
 *
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    20
 *
6374
e214162c907e 6982137: Rebranding pass 2 - missed copyright changes
ohair
parents: 5579
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e214162c907e 6982137: Rebranding pass 2 - missed copyright changes
ohair
parents: 5579
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e214162c907e 6982137: Rebranding pass 2 - missed copyright changes
ohair
parents: 5579
diff changeset
    23
 * questions.
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    24
 */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    25
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    26
#include "X11SurfaceData.h"
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    27
#include <jni.h>
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    28
#include <math.h>
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    29
#include "Region.h"
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    30
#include "fontscalerdefs.h"
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    31
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    32
#include <X11/extensions/Xrender.h>
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    33
7933
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    34
/* On Solaris 10 updates 8, 9, the render.h file defines these
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    35
 * protocol values but does not define the structs in Xrender.h.
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    36
 * Thus in order to get these always defined on Solaris 10
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    37
 * we will undefine the symbols if we have determined via the
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    38
 * makefiles that Xrender.h is lacking the structs. This will
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    39
 * trigger providing our own definitions as on earlier updates.
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    40
 * We could assume that *all* Solaris 10 update versions will lack the updated
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    41
 * Xrender.h and do this based solely on O/S being any 5.10 version, but this
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    42
 * could still change and we'd be broken again as we'd be re-defining them.
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    43
 */
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    44
#ifdef SOLARIS10_NO_XRENDER_STRUCTS
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    45
#undef X_RenderCreateLinearGradient
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    46
#undef X_RenderCreateRadialGradient
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    47
#endif
afae9398b405 7001056: JDK 7 fails on to build on Solaris 10 update 9 - updated Xrender header files
prr
parents: 6374
diff changeset
    48
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    49
#ifndef X_RenderCreateLinearGradient
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    50
typedef struct _XLinearGradient {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    51
    XPointFixed p1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    52
    XPointFixed p2;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    53
} XLinearGradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    54
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    55
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    56
#ifndef X_RenderCreateRadialGradient
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    57
typedef struct _XCircle {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    58
    XFixed x;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    59
    XFixed y;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    60
    XFixed radius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    61
} XCircle;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    62
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    63
typedef struct _XRadialGradient {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    64
    XCircle inner;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    65
    XCircle outer;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    66
} XRadialGradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    67
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    68
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
    69
#include <dlfcn.h>
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
    70
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    71
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    72
/* Solaris 10 will not have these symbols at runtime */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    73
#include <link.h>
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    74
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    75
typedef Picture (*XRenderCreateLinearGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    76
                                     (Display *dpy,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    77
                                     const XLinearGradient *gradient,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    78
                                     const XFixed *stops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    79
                                     const XRenderColor *colors,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    80
                                     int nstops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    81
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    82
typedef Picture (*XRenderCreateRadialGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    83
                                     (Display *dpy,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    84
                                     const XRadialGradient *gradient,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    85
                                     const XFixed *stops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    86
                                     const XRenderColor *colors,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    87
                                     int nstops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    88
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    89
static
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    90
XRenderCreateLinearGradientFuncType XRenderCreateLinearGradientFunc = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    91
static
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    92
 XRenderCreateRadialGradientFuncType XRenderCreateRadialGradientFunc = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    93
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    94
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    95
#define BUILD_TRANSFORM_MATRIX(TRANSFORM, M00, M01, M02, M10, M11, M12)                        \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    96
    {                                                                                          \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    97
      TRANSFORM.matrix[0][0] = M00;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    98
      TRANSFORM.matrix[0][1] = M01;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    99
      TRANSFORM.matrix[0][2] = M02;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   100
      TRANSFORM.matrix[1][0] = M10;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   101
      TRANSFORM.matrix[1][1] = M11;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   102
      TRANSFORM.matrix[1][2] = M12;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   103
      TRANSFORM.matrix[2][0] = 0;                                                              \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   104
      TRANSFORM.matrix[2][1] = 0;                                                              \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   105
      TRANSFORM.matrix[2][2] = 1<<16;                                                          \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   106
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   107
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   108
/* The xrender pipleine requires libXrender.so version 0.9.3 or later. */
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   109
#define REQUIRED_XRENDER_VER1 0
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   110
#define REQUIRED_XRENDER_VER2 9
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   111
#define REQUIRED_XRENDER_VER3 3
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   112
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   113
#define PKGINFO_LINE_LEN_MAX 256
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   114
#define PKGINFO_LINE_CNT_MAX 50
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   115
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   116
static jboolean IsXRenderAvailable(jboolean verbose) {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   117
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   118
    void *xrenderlib;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   119
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   120
    int major_opcode, first_event, first_error;
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   121
    jboolean available = JNI_TRUE;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   122
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   123
    if (!XQueryExtension(awt_display, "RENDER",
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   124
                         &major_opcode, &first_event, &first_error)) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   125
        return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   126
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   127
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   128
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   129
    xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   130
    if (xrenderlib != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   131
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   132
      XRenderCreateLinearGradientFunc =
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   133
        (XRenderCreateLinearGradientFuncType)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   134
        dlsym(xrenderlib, "XRenderCreateLinearGradient");
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   135
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   136
      XRenderCreateRadialGradientFunc =
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   137
        (XRenderCreateRadialGradientFuncType)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   138
        dlsym(xrenderlib, "XRenderCreateRadialGradient");
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   139
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   140
      if (XRenderCreateLinearGradientFunc == NULL ||
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   141
          XRenderCreateRadialGradientFunc == NULL)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   142
      {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   143
        available = JNI_FALSE;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   144
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   145
      dlclose(xrenderlib);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   146
    } else {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   147
      available = JNI_FALSE;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   148
    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   149
#else
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   150
    Dl_info info;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   151
    jboolean versionInfoIsFound = JNI_FALSE;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   152
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   153
    memset(&info, 0, sizeof(Dl_info));
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   154
    if (dladdr(&XRenderChangePicture, &info) && info.dli_fname != NULL) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   155
      char pkgInfoPath[FILENAME_MAX];
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   156
      char *pkgFileName = "/pkgconfig/xrender.pc";
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   157
      size_t pkgFileNameLen = strlen(pkgFileName);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   158
      size_t pos, len = strlen(info.dli_fname);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   159
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   160
      pos = len;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   161
      while (pos > 0 && info.dli_fname[pos] != '/') {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   162
        pos -= 1;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   163
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   164
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   165
      if (pos > 0 && pos < (FILENAME_MAX - pkgFileNameLen - 1)) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   166
        struct stat stat_info;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   167
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   168
        // compose absolute filename to package config
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   169
        strncpy(pkgInfoPath, info.dli_fname, pos);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   170
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   171
        strcpy(pkgInfoPath + pos, pkgFileName);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   172
        pkgInfoPath[pos + pkgFileNameLen] = '\0';
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   173
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   174
        // check whether the config file exist and is a regular file
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   175
        if ((stat(pkgInfoPath, &stat_info)== 0) &&
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   176
            S_ISREG(stat_info.st_mode))
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   177
        {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   178
          FILE *fp = fopen(pkgInfoPath, "r");
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   179
          if (fp != NULL) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   180
            char line[PKGINFO_LINE_LEN_MAX];
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   181
            int lineCount = PKGINFO_LINE_CNT_MAX;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   182
            char *versionPrefix = "Version: ";
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   183
            size_t versionPrefixLen = strlen(versionPrefix);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   184
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   185
            // look for version
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   186
            while(fgets(line,sizeof(line),fp) != NULL && --lineCount > 0) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   187
              size_t lineLen = strlen(line);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   188
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   189
              if (lineLen > versionPrefixLen &&
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   190
                  strncmp(versionPrefix, line, versionPrefixLen) == 0)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   191
              {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   192
                int v1 = 0, v2 = 0, v3 = 0;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   193
                int numNeeded = 3,numProcessed;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   194
                char* version = line + versionPrefixLen;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   195
                numProcessed = sscanf(version, "%d.%d.%d", &v1, &v2, &v3);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   196
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   197
                if (numProcessed == numNeeded) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   198
                  // we successfuly read the library version
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   199
                  versionInfoIsFound = JNI_TRUE;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   200
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   201
                  if (REQUIRED_XRENDER_VER1 == v1 &&
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   202
                      ((REQUIRED_XRENDER_VER2 > v2) ||
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   203
                       ((REQUIRED_XRENDER_VER2 == v2) && (REQUIRED_XRENDER_VER3 > v3))))
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   204
                  {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   205
                    available = JNI_FALSE;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   206
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   207
                    if (verbose) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   208
                      printf("INFO: the version %d.%d.%d of libXrender.so is "
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   209
                             "not supported.\n\tSee release notes for more details.\n",
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   210
                             v1, v2, v3);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   211
                      fflush(stdout);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   212
                    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   213
                  } else {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   214
                    if (verbose) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   215
                      printf("INFO: The version of libXrender.so "
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   216
                             "is detected as %d.%d%d\n", v1, v2, v3);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   217
                      fflush(stdout);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   218
                    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   219
                  }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   220
                }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   221
                break;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   222
              }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   223
            }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   224
            fclose(fp);
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   225
          }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   226
        }
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   227
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   228
    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   229
    if (verbose && !versionInfoIsFound) {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   230
      printf("WARNING: The version of libXrender.so cannot be detected.\n,"
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   231
             "The pipe line will be enabled, but note that versions less than 0.9.3\n"
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   232
             "may cause hangs and crashes\n"
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   233
             "\tSee the release notes for more details.\n");
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   234
      fflush(stdout);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   235
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   236
#endif
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   237
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   238
    return available;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   239
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   240
/*
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   241
 * Class:     sun_awt_X11GraphicsEnvironment
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   242
 * Method:    initGLX
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   243
 * Signature: ()Z
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   244
 */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   245
JNIEXPORT jboolean JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   246
Java_sun_awt_X11GraphicsEnvironment_initXRender
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   247
(JNIEnv *env, jclass x11ge, jboolean verbose)
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   248
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   249
#ifndef HEADLESS
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   250
    static jboolean xrenderAvailable = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   251
    static jboolean firstTime = JNI_TRUE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   252
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   253
    if (firstTime) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   254
        AWT_LOCK();
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   255
        xrenderAvailable = IsXRenderAvailable(verbose);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   256
        AWT_UNLOCK();
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   257
        firstTime = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   258
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   259
    return xrenderAvailable;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   260
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   261
    return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   262
#endif /* !HEADLESS */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   263
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   264
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   265
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   266
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   267
Java_sun_java2d_xr_XRBackendNative_initIDs(JNIEnv *env, jclass cls) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   268
    char *maskData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   269
    XImage* defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   270
    jfieldID maskImgID;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   271
    jlong fmt8 =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   272
        ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   273
    jlong fmt32 =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   274
       ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   275
    jfieldID a8ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_A8", "J");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   276
    jfieldID argb32ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB32", "J");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   277
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   278
    (*env)->SetStaticLongField(env, cls, a8ID, fmt8);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   279
    (*env)->SetStaticLongField(env, cls, argb32ID, fmt32);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   280
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   281
    maskData = (char *) malloc(32*32);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   282
    if (maskData == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   283
       return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   284
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   285
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   286
    defaultImg = XCreateImage(awt_display, NULL, 8, ZPixmap, 0, maskData, 32, 32, 8, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   287
    defaultImg->data = maskData; //required?
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   288
    maskImgID = (*env)->GetStaticFieldID(env, cls, "MASK_XIMG", "J");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   289
    (*env)->SetStaticLongField(env, cls, maskImgID, ptr_to_jlong(defaultImg));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   290
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   291
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   292
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   293
Java_sun_java2d_xr_XRBackendNative_freeGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   294
 (JNIEnv *env, jobject this, jlong gc) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   295
    XFreeGC(awt_display, (GC) jlong_to_ptr(gc));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   296
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   297
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   298
JNIEXPORT jlong JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   299
Java_sun_java2d_xr_XRBackendNative_createGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   300
 (JNIEnv *env, jobject this, jint drawable) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   301
  GC xgc = XCreateGC(awt_display, (Drawable) drawable, 0L, NULL);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   302
  return ptr_to_jlong(xgc);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   303
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   304
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   305
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   306
Java_sun_java2d_xr_XRBackendNative_createPixmap(JNIEnv *env, jobject this,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   307
                                                jint drawable, jint depth,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   308
                                                jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   309
    return (jint) XCreatePixmap(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   310
                                width, height, depth);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   311
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   312
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   313
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   314
Java_sun_java2d_xr_XRBackendNative_createPictureNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   315
 (JNIEnv *env, jclass cls, jint drawable, jlong formatPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   316
  XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   317
  return XRenderCreatePicture(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   318
                              (XRenderPictFormat *) jlong_to_ptr(formatPtr),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   319
                               0, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   320
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   321
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   322
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   323
Java_sun_java2d_xr_XRBackendNative_freePicture
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   324
 (JNIEnv *env, jobject this, jint picture) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   325
      XRenderFreePicture(awt_display, (Picture) picture);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   326
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   327
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   328
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   329
Java_sun_java2d_xr_XRBackendNative_freePixmap
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   330
 (JNIEnv *env, jobject this, jint pixmap) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   331
   XFreePixmap(awt_display, (Pixmap) pixmap);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   332
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   333
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   334
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   335
Java_sun_java2d_xr_XRBackendNative_setPictureRepeat
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   336
 (JNIEnv *env, jobject this, jint picture, jint repeat) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   337
    XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   338
    pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   339
    XRenderChangePicture (awt_display, (Picture) picture, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   340
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   341
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   342
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   343
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   344
Java_sun_java2d_xr_XRBackendNative_setGCExposures
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   345
 (JNIEnv *env, jobject this, jlong gc, jboolean exposure) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   346
    XSetGraphicsExposures(awt_display,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   347
                         (GC) jlong_to_ptr(gc), exposure ? True : False); //TODO: ????
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   348
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   349
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   350
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   351
Java_sun_java2d_xr_XRBackendNative_setGCForeground
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   352
 (JNIEnv *env, jobject this, jlong gc, jint pixel) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   353
    XSetForeground(awt_display, (GC) jlong_to_ptr(gc), (unsigned long) pixel);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   354
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   355
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   356
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   357
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   358
Java_sun_java2d_xr_XRBackendNative_copyArea
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   359
 (JNIEnv *env, jobject this, jint src, jint dst, jlong gc,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   360
  jint srcx, jint srcy, jint width, jint height, jint dstx, jint dsty) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   361
    XCopyArea(awt_display, (Drawable) src, (Drawable) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   362
             (GC) jlong_to_ptr(gc), srcx, srcy, width, height, dstx, dsty);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   363
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   364
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   365
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   366
Java_sun_java2d_xr_XRBackendNative_renderComposite
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   367
 (JNIEnv *env, jobject this, jbyte op, jint src, jint mask, jint dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   368
  jint srcX, jint srcY, jint maskX, jint maskY,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   369
  jint dstX, jint dstY, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   370
    XRenderComposite (awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   371
                      (Picture)src, (Picture)mask, (Picture)dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   372
                       srcX, srcY, maskX, maskY, dstX, dstY, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   373
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   374
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   375
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   376
Java_sun_java2d_xr_XRBackendNative_renderRectangle
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   377
 (JNIEnv *env, jobject this, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   378
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   379
  jint x, jint y, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   380
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   381
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   382
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   383
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   384
    color.blue = blue;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   385
    XRenderFillRectangle(awt_display, op, (Picture) dst, &color,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   386
                         x, y, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   387
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   388
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   389
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   390
Java_sun_java2d_xr_XRBackendNative_XRenderRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   391
 (JNIEnv *env, jclass xsd, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   392
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   393
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   394
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   395
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   396
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   397
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   398
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   399
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   400
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   401
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   402
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   403
    color.blue = blue;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   404
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   405
    if (rectCnt <= 256) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   406
        xRects = &sRects[0];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   407
    } else {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   408
        xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   409
        if (xRects == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   410
            return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   411
        }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   412
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   413
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   414
    if ((rects = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   415
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   416
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   417
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   418
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   419
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   420
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   421
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   422
    for (i=0; i < rectCnt; i++) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   423
        xRects[i].x = rects[i*4 + 0];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   424
        xRects[i].y = rects[i*4 + 1];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   425
        xRects[i].width = rects[i*4 + 2];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   426
        xRects[i].height = rects[i*4 + 3];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   427
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   428
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   429
    XRenderFillRectangles(awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   430
                          (Picture) dst, &color, xRects, rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   431
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   432
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   433
    if (xRects != &sRects[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   434
        free(xRects);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   435
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   436
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   437
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   438
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   439
Java_sun_java2d_xr_XRBackendNative_XRSetTransformNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   440
 (JNIEnv *env, jclass xsd, jint pic,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   441
  jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   442
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   443
  XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   444
  BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   445
  XRenderSetPictureTransform (awt_display, (Picture) pic, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   446
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   447
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   448
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   449
Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   450
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   451
     jshortArray pixelsArray, jint x1, jint y1, jint x2, jint y2,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   452
     jint numStops, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   453
     jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   454
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   455
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   456
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   457
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   458
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   459
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   460
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   461
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   462
   XLinearGradient grad;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   463
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   464
   if ((pixels = (jshort *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   465
        (*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   466
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   467
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   468
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   469
       (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   470
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   471
                                              pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   472
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   473
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   474
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   475
    grad.p1.x = x1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   476
    grad.p1.y = y1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   477
    grad.p2.x = x2;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   478
    grad.p2.y = y2;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   479
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   480
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   481
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   482
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   483
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   484
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   485
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   486
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   487
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   488
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   489
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   490
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   491
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   492
    if (XRenderCreateLinearGradientFunc!=NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   493
      gradient = (*XRenderCreateLinearGradientFunc)(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   494
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   495
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   496
    gradient = XRenderCreateLinearGradient(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   497
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   498
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   499
    free(stops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   500
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   501
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   502
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   503
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   504
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   505
        BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   506
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   507
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   508
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   509
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   510
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   511
   return (jint) gradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   512
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   513
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   514
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   515
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   516
Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   517
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   518
     jshortArray pixelsArray, jint numStops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   519
     jint innerRadius, jint outerRadius, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   520
     jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   521
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   522
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   523
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   524
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   525
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   526
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   527
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   528
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   529
   XRadialGradient grad;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   530
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   531
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   532
   if ((pixels =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   533
       (jshort *)(*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   534
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   535
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   536
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   537
        (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   538
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   539
                                             pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   540
       return -1; //TODO release pixels first
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   541
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   542
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   543
    grad.inner.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   544
    grad.inner.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   545
    grad.inner.radius = innerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   546
    grad.outer.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   547
    grad.outer.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   548
    grad.outer.radius = outerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   549
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   550
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   551
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   552
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   553
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   554
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   555
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   556
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   557
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   558
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   559
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   560
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   561
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   562
    if (XRenderCreateRadialGradientFunc != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   563
        gradient = (jint) (*XRenderCreateRadialGradientFunc)(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   564
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   565
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   566
    gradient = (jint) XRenderCreateRadialGradient(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   567
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   568
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   569
    free(stops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   570
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   571
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   572
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   573
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   574
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   575
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   576
        BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   577
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   578
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   579
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   580
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   581
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   582
   return (jint) gradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   583
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   584
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   585
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   586
Java_sun_java2d_xr_XRBackendNative_setFilter
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   587
 (JNIEnv *env, jobject this, jint picture, jint filter) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   588
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   589
  char * filterName = "fast";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   590
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   591
  switch(filter) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   592
    case 0:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   593
      filterName = "fast";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   594
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   595
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   596
    case 1:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   597
      filterName = "good";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   598
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   599
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   600
    case 2:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   601
      filterName = "best";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   602
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   603
  }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   604
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   605
    XRenderSetPictureFilter(awt_display, (Picture) picture, filterName, NULL, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   606
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   607
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   608
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   609
Java_sun_java2d_xr_XRBackendNative_XRSetClipNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   610
    (JNIEnv *env, jclass xsd, jlong dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   611
     jint x1, jint y1, jint x2, jint y2,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   612
     jobject complexclip, jboolean isGC)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   613
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   614
    int numrects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   615
    XRectangle rects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   616
    XRectangle *pRect = rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   617
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   618
    numrects = RegionToYXBandedRectangles(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   619
            x1, y1, x2, y2, complexclip,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   620
            &pRect, 256);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   621
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   622
    if (isGC == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   623
      if (dst != (jlong) 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   624
          XSetClipRectangles(awt_display, (GC) jlong_to_ptr(dst), 0, 0, pRect, numrects, YXBanded);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   625
      }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   626
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   627
       XRenderSetPictureClipRectangles (awt_display, (Picture) dst, 0, 0, pRect, numrects);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   628
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   629
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   630
    if (pRect != rects) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   631
        free(pRect);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   632
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   633
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   634
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   635
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   636
Java_sun_java2d_xr_XRBackendNative_putMaskNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   637
 (JNIEnv *env, jclass cls, jint drawable, jlong gc, jbyteArray imageData,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   638
  jint sx, jint sy, jint dx, jint dy, jint width, jint height,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   639
  jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   640
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   641
    int line, pix;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   642
    char *mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   643
    char *defaultData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   644
    XImage *defaultImg, *img;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   645
    jboolean imageFits;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   646
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   647
    if ((mask = (char *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   648
         (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   649
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   650
     }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   651
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   652
    defaultImg = (XImage *) jlong_to_ptr(imgPtr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   653
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   654
    if (ea != 1.0f) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   655
        for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   656
            for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   657
                int index = maskScan*line + pix + maskOff;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   658
                mask[index] = (((unsigned char) mask[index])*ea);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   659
            }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   660
        }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   661
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   662
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   663
    /*
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   664
    * 1. If existing XImage and supplied buffer match, only adjust the data pointer
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   665
    * 2. If existing XImage is large enough to hold the data but does not match in
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   666
    *    scan the data is copied to fit the XImage.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   667
    * 3. If data is larger than the existing XImage a new temporary XImage is
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   668
    *    allocated.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   669
    * The default XImage is optimized for the AA tiles, which are currently 32x32.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   670
    */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   671
    defaultData = defaultImg->data;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   672
    img = defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   673
    imageFits = defaultImg->width >= width && defaultImg->height >= height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   674
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   675
    if (imageFits &&
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   676
        maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   677
        defaultImg->data = mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   678
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   679
        if (imageFits) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   680
            for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   681
                for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   682
                    img->data[line*img->bytes_per_line + pix] =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   683
                        (unsigned char) (mask[maskScan*line + pix + maskOff]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   684
                }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   685
            }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   686
        } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   687
            img = XCreateImage(awt_display, NULL, 8, ZPixmap,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   688
                               maskOff, mask, maskScan, height, 8, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   689
        }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   690
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   691
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   692
    XPutImage(awt_display, (Pixmap) drawable, (GC) jlong_to_ptr(gc),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   693
              img, 0, 0, 0, 0, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   694
    (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   695
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   696
    if (img != defaultImg) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   697
        img->data = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   698
        XDestroyImage(img);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   699
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   700
    defaultImg->data = defaultData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   701
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   702
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   703
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   704
Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   705
 (JNIEnv *env, jclass cls, jint glyphSet,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   706
  jlongArray glyphInfoPtrsArray, jint glyphCnt,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   707
  jbyteArray pixelDataArray, int pixelDataLength) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   708
    jlong *glyphInfoPtrs;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   709
    unsigned char *pixelData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   710
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   711
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   712
    XGlyphInfo *xginfo = (XGlyphInfo *) malloc(sizeof(XGlyphInfo) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   713
    Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   714
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   715
    if (xginfo == NULL || gid == NULL) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   716
        if (xginfo != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   717
            free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   718
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   719
        if (gid != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   720
            free(gid);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   721
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   722
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   723
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   724
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   725
    if ((glyphInfoPtrs = (jlong *)(*env)->
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   726
        GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   727
    {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   728
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   729
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   730
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   731
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   732
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   733
    if ((pixelData = (unsigned char *)
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   734
        (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   735
    {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   736
        (*env)->ReleasePrimitiveArrayCritical(env,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   737
                                glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   738
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   739
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   740
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   741
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   742
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   743
    for (i=0; i < glyphCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   744
      GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   745
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   746
      gid[i] = (Glyph) (0x0ffffffffL & ((unsigned long)(jginfo->cellInfo)));
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   747
      xginfo[i].x = (-jginfo->topLeftX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   748
      xginfo[i].y = (-jginfo->topLeftY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   749
      xginfo[i].width = jginfo->width;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   750
      xginfo[i].height = jginfo->height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   751
      xginfo[i].xOff = round(jginfo->advanceX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   752
      xginfo[i].yOff = round(jginfo->advanceY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   753
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   754
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   755
    XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   756
                     (const char*)pixelData, pixelDataLength);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   757
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   758
    (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   759
    (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   760
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   761
    free(xginfo);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   762
    free(gid);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   763
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   764
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   765
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   766
Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   767
 (JNIEnv *env, jclass cls, jint glyphSet, jintArray gidArray, jint glyphCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   768
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   769
    /* The glyph ids are 32 bit but may be stored in a 64 bit long on
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   770
     * a 64 bit architecture. So optimise the 32 bit case to avoid
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   771
     * extra stack or heap allocations by directly referencing the
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   772
     * underlying Java array and only allocate on 64 bit.
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   773
     */
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   774
    if (sizeof(jint) == sizeof(Glyph)) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   775
        jint *gids =
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   776
            (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   777
        if (gids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   778
            return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   779
        } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   780
             XRenderFreeGlyphs(awt_display,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   781
                               (GlyphSet)glyphSet, (Glyph *)gids, glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   782
             (*env)->ReleasePrimitiveArrayCritical(env, gidArray,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   783
                                                   gids, JNI_ABORT);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   784
        }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   785
        return;
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   786
    } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   787
        Glyph stack_ids[64];
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   788
        Glyph *gids = NULL;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   789
        jint* jgids = NULL;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   790
        int i;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   791
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   792
        if (glyphCnt <= 64) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   793
            gids = stack_ids;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   794
        } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   795
            gids = (Glyph *)malloc(sizeof(Glyph) * glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   796
            if (gids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   797
                return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   798
            }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   799
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   800
        jgids = (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   801
        if (jgids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   802
            if (gids != stack_ids) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   803
                free(gids);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   804
            }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   805
            return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   806
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   807
        for (i=0; i < glyphCnt; i++) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   808
            gids[i] = jgids[i];
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   809
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   810
        XRenderFreeGlyphs(awt_display,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   811
                          (GlyphSet) glyphSet, gids, glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   812
        (*env)->ReleasePrimitiveArrayCritical(env, gidArray,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   813
                                              jgids, JNI_ABORT);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   814
        if (gids != stack_ids) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   815
            free(gids);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   816
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   817
    }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   818
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   819
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   820
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   821
Java_sun_java2d_xr_XRBackendNative_XRenderCreateGlyphSetNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   822
 (JNIEnv *env, jclass cls, jlong format) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   823
  return XRenderCreateGlyphSet(awt_display, (XRenderPictFormat *) jlong_to_ptr(format));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   824
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   825
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   826
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   827
Java_sun_java2d_xr_XRBackendNative_XRenderCompositeTextNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   828
 (JNIEnv *env, jclass cls, jint op, jint src, jint dst, jlong maskFmt,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   829
  jintArray eltArray, jintArray  glyphIDArray, jint eltCnt, jint glyphCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   830
    jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   831
    jint *ids;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   832
    jint *elts;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   833
    XGlyphElt32 *xelts;
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   834
    unsigned int *xids;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   835
    XGlyphElt32 selts[24];
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   836
    unsigned int sids[256];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   837
    int charCnt = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   838
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   839
    if (eltCnt <= 24) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   840
      xelts = &selts[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   841
    }else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   842
      xelts = (XGlyphElt32 *) malloc(sizeof(XGlyphElt32) * eltCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   843
      if (xelts == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   844
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   845
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   846
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   847
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   848
    if (glyphCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   849
      xids = &sids[0];
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   850
    } else {
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   851
      xids = (unsigned int*)malloc(sizeof(unsigned int) * glyphCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   852
      if (xids == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   853
          if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   854
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   855
          }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   856
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   857
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   858
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   859
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   860
    if ((ids = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   861
         (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   862
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   863
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   864
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   865
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   866
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   867
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   868
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   869
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   870
    if ((elts = (jint *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   871
          (*env)->GetPrimitiveArrayCritical(env, eltArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   872
        (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   873
                                              glyphIDArray, ids, JNI_ABORT);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   874
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   875
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   876
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   877
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   878
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   879
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   880
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   881
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   882
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   883
    for (i=0; i < glyphCnt; i++) {
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   884
      xids[i] = ids[i];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   885
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   886
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   887
    for (i=0; i < eltCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   888
      xelts[i].nchars = elts[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   889
      xelts[i].xOff = elts[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   890
      xelts[i].yOff = elts[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   891
      xelts[i].glyphset = (GlyphSet) elts[i*4 + 3];
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   892
      xelts[i].chars = &xids[charCnt];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   893
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   894
      charCnt += xelts[i].nchars;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   895
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   896
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   897
    XRenderCompositeText32(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   898
                           (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   899
                            0, 0, 0, 0, xelts, eltCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   900
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   901
    (*env)->ReleasePrimitiveArrayCritical(env, glyphIDArray, ids, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   902
    (*env)->ReleasePrimitiveArrayCritical(env, eltArray, elts, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   903
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   904
    if (xelts != &selts[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   905
        free(xelts);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   906
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   907
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   908
    if (xids != &sids[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   909
        free(xids);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   910
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   911
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   912
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   913
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   914
Java_sun_java2d_xr_XRBackendNative_setGCMode
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   915
 (JNIEnv *env, jobject this, jlong gc, jboolean copy) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   916
  GC xgc = (GC) jlong_to_ptr(gc);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   917
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   918
  if (copy == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   919
    XSetFunction(awt_display, xgc, GXcopy);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   920
  } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   921
    XSetFunction(awt_display, xgc, GXxor);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   922
  }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   923
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   924
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   925
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   926
Java_sun_java2d_xr_XRBackendNative_GCRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   927
 (JNIEnv *env, jclass xsd, jint dst, jlong gc,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   928
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   929
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   930
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   931
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   932
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   933
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   934
    if (rectCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   935
      xRects = &sRects[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   936
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   937
      xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   938
      if (xRects == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   939
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   940
      }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   941
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   942
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   943
    if ((rects = (jint*)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   944
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   945
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   946
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   947
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   948
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   949
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   950
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   951
    for (i=0; i < rectCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   952
      xRects[i].x = rects[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   953
      xRects[i].y = rects[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   954
      xRects[i].width = rects[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   955
      xRects[i].height = rects[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   956
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   957
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   958
    XFillRectangles(awt_display, (Drawable) dst, (GC) jlong_to_ptr(gc), xRects, rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   959
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   960
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   961
    if (xRects != &sRects[0]) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   962
      free(xRects);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   963
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   964
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   965
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   966
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   967
Java_sun_java2d_xr_XRBackendNative_renderCompositeTrapezoidsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   968
 (JNIEnv *env, jclass cls, jbyte op, jint src, jlong maskFmt,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   969
 jint dst, jint srcX, jint srcY, jintArray  trapArray) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   970
    jint *traps;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   971
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   972
    if ((traps = (jint *) (*env)->GetPrimitiveArrayCritical(env, trapArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   973
      return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   974
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   975
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   976
    XRenderCompositeTrapezoids(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   977
                               (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   978
                               srcX, srcY, (XTrapezoid *) (traps+5), traps[0]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   979
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   980
    (*env)->ReleasePrimitiveArrayCritical(env, trapArray, traps, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   981
}