jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c
author jchen
Wed, 24 Jul 2013 13:05:03 -0700
changeset 19009 1f1914231324
parent 19006 fcda25164f7d
child 19171 14d41f09941b
permissions -rw-r--r--
8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow Reviewed-by: prr, vadim
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    74
typedef Picture (*XRenderCreateLinearGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    75
                                     (Display *dpy,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    76
                                     const XLinearGradient *gradient,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    77
                                     const XFixed *stops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    78
                                     const XRenderColor *colors,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    79
                                     int nstops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    80
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    81
typedef Picture (*XRenderCreateRadialGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    82
                                     (Display *dpy,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    83
                                     const XRadialGradient *gradient,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    84
                                     const XFixed *stops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    85
                                     const XRenderColor *colors,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    86
                                     int nstops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    87
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    88
static
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    89
XRenderCreateLinearGradientFuncType XRenderCreateLinearGradientFunc = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    90
static
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    91
 XRenderCreateRadialGradientFuncType XRenderCreateRadialGradientFunc = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    92
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    93
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    94
#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
    95
    {                                                                                          \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    96
      TRANSFORM.matrix[0][0] = M00;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    97
      TRANSFORM.matrix[0][1] = M01;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    98
      TRANSFORM.matrix[0][2] = M02;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    99
      TRANSFORM.matrix[1][0] = M10;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   100
      TRANSFORM.matrix[1][1] = M11;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   101
      TRANSFORM.matrix[1][2] = M12;                                                            \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   102
      TRANSFORM.matrix[2][0] = 0;                                                              \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   103
      TRANSFORM.matrix[2][1] = 0;                                                              \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   104
      TRANSFORM.matrix[2][2] = 1<<16;                                                          \
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   105
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   106
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   107
/* 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
   108
#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
   109
#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
   110
#define REQUIRED_XRENDER_VER3 3
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   111
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   112
#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
   113
#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
   114
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   115
/*
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   116
 * X protocol uses (u_int16)length to specify the length in 4 bytes quantities
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   117
 * of the whole request.  Both XRenderFillRectangles() and XFillRectangles()
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   118
 * have provisions to fragment into several requests if the number of rectangles
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   119
 * plus the current x request does not fit into 65535*4 bytes.  While
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   120
 * XRenderCreateLinearGradient() and XRenderCreateRadialGradient() have
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   121
 * provisions to gracefully degrade if the resulting request would exceed
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   122
 * 65535*4 bytes.
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   123
 *
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   124
 * Below, we define a cap of 65535*4 bytes for the maximum X request payload
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   125
 * allowed for Non-(XRenderFillRectangles() or XFillRectangles()) API calls,
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   126
 * just to be conservative.  This is offset by the size of our maximum x*Req
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   127
 * type in this compilation unit, which is xRenderCreateRadiaGradientReq.
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   128
 *
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   129
 * Note that sizeof(xRenderCreateRadiaGradientReq) = 36
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   130
 */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   131
#define MAX_PAYLOAD (262140u - 36u)
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   132
#define MAXUINT (0xffffffffu)
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   133
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   134
static jboolean IsXRenderAvailable(jboolean verbose) {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   135
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   136
    void *xrenderlib;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   137
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   138
    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
   139
    jboolean available = JNI_TRUE;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   140
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   141
    if (!XQueryExtension(awt_display, "RENDER",
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   142
                         &major_opcode, &first_event, &first_error)) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   143
        return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   144
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   145
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   146
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   147
    xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   148
    if (xrenderlib != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   149
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   150
      XRenderCreateLinearGradientFunc =
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   151
        (XRenderCreateLinearGradientFuncType)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   152
        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
   153
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   154
      XRenderCreateRadialGradientFunc =
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   155
        (XRenderCreateRadialGradientFuncType)
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   156
        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
   157
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   158
      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
   159
          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
   160
      {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   161
        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
   162
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   163
      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
   164
    } else {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   165
      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
   166
    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   167
#else
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   168
    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
   169
    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
   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
    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
   172
    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
   173
      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
   174
      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
   175
      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
   176
      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
   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
      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
   179
      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
   180
        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
   181
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   182
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   183
      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
   184
        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
   185
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   186
        // 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
   187
        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
   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
        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
   190
        pkgInfoPath[pos + pkgFileNameLen] = '\0';
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   191
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   192
        // 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
   193
        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
   194
            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
   195
        {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   196
          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
   197
          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
   198
            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
   199
            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
   200
            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
   201
            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
   202
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   203
            // 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
   204
            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
   205
              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
   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 (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
   208
                  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
   209
              {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   210
                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
   211
                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
   212
                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
   213
                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
   214
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   215
                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
   216
                  // 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
   217
                  versionInfoIsFound = JNI_TRUE;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   218
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   219
                  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
   220
                      ((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
   221
                       ((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
   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
                    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
   224
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   225
                    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
   226
                      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
   227
                             "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
   228
                             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
   229
                      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
   230
                    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   231
                  } else {
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   232
                    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
   233
                      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
   234
                             "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
   235
                      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
   236
                    }
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
                }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   239
                break;
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   240
              }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   241
            }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   242
            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
   243
          }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   244
        }
9760
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   245
      }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   246
    }
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   247
    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
   248
      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
   249
             "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
   250
             "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
   251
             "\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
   252
      fflush(stdout);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   253
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   254
#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
   255
5c5883cf6c96 7032904: XRender: Java2Demo : Infinite loop in Java_sun_java2d_loops_MaskBlit_MaskBlit on OEL 5.6 x64
bae
parents: 9050
diff changeset
   256
    return available;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   257
}
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
 * Class:     sun_awt_X11GraphicsEnvironment
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   260
 * Method:    initGLX
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   261
 * Signature: ()Z
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   262
 */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   263
JNIEXPORT jboolean JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   264
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
   265
(JNIEnv *env, jclass x11ge, jboolean verbose)
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   266
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   267
#ifndef HEADLESS
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   268
    static jboolean xrenderAvailable = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   269
    static jboolean firstTime = JNI_TRUE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   270
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   271
    if (firstTime) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   272
        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
   273
        xrenderAvailable = IsXRenderAvailable(verbose);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   274
        AWT_UNLOCK();
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   275
        firstTime = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   276
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   277
    return xrenderAvailable;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   278
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   279
    return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   280
#endif /* !HEADLESS */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   281
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   282
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   283
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   284
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   285
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
   286
    char *maskData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   287
    XImage* defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   288
    jfieldID maskImgID;
19006
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   289
    jlong fmt8;
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   290
    jlong fmt32;
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   291
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   292
    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
   293
    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
   294
19006
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   295
    if (awt_display == (Display *)NULL) {
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   296
        return;
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   297
    }
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   298
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   299
    fmt8 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8));
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   300
    fmt32 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32));
fcda25164f7d 7196866: CTW fails on all Solaris platforms
prr
parents: 17404
diff changeset
   301
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   302
    (*env)->SetStaticLongField(env, cls, a8ID, fmt8);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   303
    (*env)->SetStaticLongField(env, cls, argb32ID, fmt32);
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
    maskData = (char *) malloc(32*32);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   306
    if (maskData == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   307
       return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   308
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   309
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   310
    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
   311
    defaultImg->data = maskData; //required?
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   312
    maskImgID = (*env)->GetStaticFieldID(env, cls, "MASK_XIMG", "J");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   313
    (*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
   314
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   315
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   316
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   317
Java_sun_java2d_xr_XRBackendNative_freeGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   318
 (JNIEnv *env, jobject this, jlong gc) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   319
    XFreeGC(awt_display, (GC) jlong_to_ptr(gc));
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 jlong JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   323
Java_sun_java2d_xr_XRBackendNative_createGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   324
 (JNIEnv *env, jobject this, jint drawable) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   325
  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
   326
  return ptr_to_jlong(xgc);
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   329
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   330
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
   331
                                                jint drawable, jint depth,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   332
                                                jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   333
    return (jint) XCreatePixmap(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   334
                                width, height, depth);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   335
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   336
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   337
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   338
Java_sun_java2d_xr_XRBackendNative_createPictureNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   339
 (JNIEnv *env, jclass cls, jint drawable, jlong formatPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   340
  XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   341
  return XRenderCreatePicture(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   342
                              (XRenderPictFormat *) jlong_to_ptr(formatPtr),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   343
                               0, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   344
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   345
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   346
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   347
Java_sun_java2d_xr_XRBackendNative_freePicture
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   348
 (JNIEnv *env, jobject this, jint picture) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   349
      XRenderFreePicture(awt_display, (Picture) picture);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   350
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   351
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   352
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   353
Java_sun_java2d_xr_XRBackendNative_freePixmap
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   354
 (JNIEnv *env, jobject this, jint pixmap) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   355
   XFreePixmap(awt_display, (Pixmap) pixmap);
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   358
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   359
Java_sun_java2d_xr_XRBackendNative_setPictureRepeat
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   360
 (JNIEnv *env, jobject this, jint picture, jint repeat) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   361
    XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   362
    pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   363
    XRenderChangePicture (awt_display, (Picture) picture, CPRepeat, &pict_attr);
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   366
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   367
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   368
Java_sun_java2d_xr_XRBackendNative_setGCExposures
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   369
 (JNIEnv *env, jobject this, jlong gc, jboolean exposure) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   370
    XSetGraphicsExposures(awt_display,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   371
                         (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
   372
}
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   375
Java_sun_java2d_xr_XRBackendNative_setGCForeground
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   376
 (JNIEnv *env, jobject this, jlong gc, jint pixel) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   377
    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
   378
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   379
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   380
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   381
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   382
Java_sun_java2d_xr_XRBackendNative_copyArea
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   383
 (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
   384
  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
   385
    XCopyArea(awt_display, (Drawable) src, (Drawable) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   386
             (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
   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_renderComposite
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   391
 (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
   392
  jint srcX, jint srcY, jint maskX, jint maskY,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   393
  jint dstX, jint dstY, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   394
    XRenderComposite (awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   395
                      (Picture)src, (Picture)mask, (Picture)dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   396
                       srcX, srcY, maskX, maskY, dstX, dstY, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   397
}
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   400
Java_sun_java2d_xr_XRBackendNative_renderRectangle
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   401
 (JNIEnv *env, jobject this, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   402
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   403
  jint x, jint y, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   404
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   405
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   406
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   407
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   408
    color.blue = blue;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   409
    XRenderFillRectangle(awt_display, op, (Picture) dst, &color,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   410
                         x, y, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   411
}
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   414
Java_sun_java2d_xr_XRBackendNative_XRenderRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   415
 (JNIEnv *env, jclass xsd, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   416
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   417
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   418
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   419
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   420
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   421
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   422
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   423
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   424
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   425
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   426
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   427
    color.blue = blue;
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
    if (rectCnt <= 256) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   430
        xRects = &sRects[0];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   431
    } else {
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   432
        if (MAXUINT / sizeof(XRectangle) < (unsigned)rectCnt) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   433
            /* rectCnt too big, integer overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   434
            return;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   435
        }
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   436
        xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   437
        if (xRects == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   438
            return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   439
        }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   440
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   441
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   442
    if ((rects = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   443
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   444
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   445
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   446
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   447
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   448
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   449
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   450
    for (i=0; i < rectCnt; i++) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   451
        xRects[i].x = rects[i*4 + 0];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   452
        xRects[i].y = rects[i*4 + 1];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   453
        xRects[i].width = rects[i*4 + 2];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   454
        xRects[i].height = rects[i*4 + 3];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   455
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   456
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   457
    XRenderFillRectangles(awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   458
                          (Picture) dst, &color, xRects, rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   459
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   460
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   461
    if (xRects != &sRects[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   462
        free(xRects);
5579
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
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   465
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   466
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   467
Java_sun_java2d_xr_XRBackendNative_XRSetTransformNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   468
 (JNIEnv *env, jclass xsd, jint pic,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   469
  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
   470
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   471
  XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   472
  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
   473
  XRenderSetPictureTransform (awt_display, (Picture) pic, &tr);
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   476
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   477
Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   478
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   479
     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
   480
     jint numStops, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   481
     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
   482
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   483
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   484
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   485
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   486
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   487
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   488
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   489
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   490
   XLinearGradient grad;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   491
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   492
   if (MAX_PAYLOAD / (sizeof(XRenderColor) + sizeof(XFixed))
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   493
       < (unsigned)numStops) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   494
       /* numStops too big, payload overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   495
       return -1;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   496
   }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   497
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   498
   if ((pixels = (jshort *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   499
        (*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   500
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   501
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   502
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   503
       (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   504
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   505
                                              pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   506
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   507
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   508
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   509
    grad.p1.x = x1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   510
    grad.p1.y = y1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   511
    grad.p2.x = x2;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   512
    grad.p2.y = y2;
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
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   515
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   516
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   517
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   518
    if (colors == NULL || stops == NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   519
        if (colors != NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   520
            free(colors);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   521
        }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   522
        if (stops != NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   523
            free(stops);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   524
        }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   525
        (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   526
        (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   527
        return -1;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   528
    }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   529
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   530
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   531
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   532
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   533
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   534
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   535
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   536
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   537
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   538
    if (XRenderCreateLinearGradientFunc!=NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   539
      gradient = (*XRenderCreateLinearGradientFunc)(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   540
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   541
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   542
    gradient = XRenderCreateLinearGradient(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   543
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   544
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   545
    free(stops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   546
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   547
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   548
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
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
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   551
        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
   552
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   553
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   554
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   555
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   556
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   557
   return (jint) gradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   558
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   559
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
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   562
Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   563
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   564
     jshortArray pixelsArray, jint numStops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   565
     jint innerRadius, jint outerRadius, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   566
     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
   567
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   568
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   569
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   570
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   571
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   572
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   573
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   574
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   575
   XRadialGradient grad;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   576
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   577
   if (MAX_PAYLOAD / (sizeof(XRenderColor) + sizeof(XFixed))
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   578
       < (unsigned)numStops) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   579
       /* numStops too big, payload overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   580
       return -1;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   581
   }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   582
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   583
   if ((pixels =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   584
       (jshort *)(*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   585
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   586
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   587
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   588
        (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   589
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   590
                                             pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   591
       return -1; //TODO release pixels first
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   592
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   593
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   594
    grad.inner.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   595
    grad.inner.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   596
    grad.inner.radius = innerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   597
    grad.outer.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   598
    grad.outer.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   599
    grad.outer.radius = outerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   600
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   601
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   602
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   603
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   604
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   605
    if (colors == NULL || stops == NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   606
        if (colors != NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   607
            free(colors);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   608
        }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   609
        if (stops != NULL) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   610
            free(stops);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   611
        }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   612
        (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   613
        (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   614
        return -1;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   615
    }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   616
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   617
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   618
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   619
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   620
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   621
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   622
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   623
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   624
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   625
    if (XRenderCreateRadialGradientFunc != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   626
        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
   627
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   628
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   629
    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
   630
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   631
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   632
    free(stops);
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
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   635
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   636
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   637
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   638
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   639
        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
   640
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   641
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   642
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   643
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   644
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   645
   return (jint) gradient;
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   648
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   649
Java_sun_java2d_xr_XRBackendNative_setFilter
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   650
 (JNIEnv *env, jobject this, jint picture, jint filter) {
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
  char * filterName = "fast";
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
  switch(filter) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   655
    case 0:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   656
      filterName = "fast";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   657
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   658
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   659
    case 1:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   660
      filterName = "good";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   661
      break;
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
    case 2:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   664
      filterName = "best";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   665
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   666
  }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   667
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   668
    XRenderSetPictureFilter(awt_display, (Picture) picture, filterName, NULL, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   669
}
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   672
Java_sun_java2d_xr_XRBackendNative_XRSetClipNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   673
    (JNIEnv *env, jclass xsd, jlong dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   674
     jint x1, jint y1, jint x2, jint y2,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   675
     jobject complexclip, jboolean isGC)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   676
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   677
    int numrects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   678
    XRectangle rects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   679
    XRectangle *pRect = rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   680
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   681
    numrects = RegionToYXBandedRectangles(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   682
            x1, y1, x2, y2, complexclip,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   683
            &pRect, 256);
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
    if (isGC == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   686
      if (dst != (jlong) 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   687
          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
   688
      }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   689
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   690
       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
   691
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   692
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   693
    if (pRect != rects) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   694
        free(pRect);
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
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   697
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   698
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   699
Java_sun_java2d_xr_XRBackendNative_putMaskNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   700
 (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
   701
  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
   702
  jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   703
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   704
    int line, pix;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   705
    char *mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   706
    char *defaultData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   707
    XImage *defaultImg, *img;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   708
    jboolean imageFits;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   709
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   710
    if ((mask = (char *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   711
         (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   712
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   713
     }
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
    defaultImg = (XImage *) jlong_to_ptr(imgPtr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   716
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   717
    if (ea != 1.0f) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   718
        for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   719
            for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   720
                int index = maskScan*line + pix + maskOff;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   721
                mask[index] = (((unsigned char) mask[index])*ea);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   722
            }
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
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   725
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   726
    /*
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   727
    * 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
   728
    * 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
   729
    *    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
   730
    * 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
   731
    *    allocated.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   732
    * 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
   733
    */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   734
    defaultData = defaultImg->data;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   735
    img = defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   736
    imageFits = defaultImg->width >= width && defaultImg->height >= height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   737
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   738
    if (imageFits &&
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   739
        maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   740
        defaultImg->data = mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   741
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   742
        if (imageFits) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   743
            for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   744
                for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   745
                    img->data[line*img->bytes_per_line + pix] =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   746
                        (unsigned char) (mask[maskScan*line + pix + maskOff]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   747
                }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   748
            }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   749
        } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   750
            img = XCreateImage(awt_display, NULL, 8, ZPixmap,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   751
                               maskOff, mask, maskScan, height, 8, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   752
        }
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
    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
   756
              img, 0, 0, 0, 0, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   757
    (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   758
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   759
    if (img != defaultImg) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   760
        img->data = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   761
        XDestroyImage(img);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   762
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   763
    defaultImg->data = defaultData;
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   766
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   767
Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   768
 (JNIEnv *env, jclass cls, jint glyphSet,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   769
  jlongArray glyphInfoPtrsArray, jint glyphCnt,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   770
  jbyteArray pixelDataArray, int pixelDataLength) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   771
    jlong *glyphInfoPtrs;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   772
    unsigned char *pixelData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   773
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   774
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   775
    if (MAX_PAYLOAD / (sizeof(XGlyphInfo) + sizeof(Glyph))
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   776
        < (unsigned)glyphCnt) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   777
        /* glyphCnt too big, payload overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   778
        return;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   779
    }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   780
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   781
    XGlyphInfo *xginfo = (XGlyphInfo *) malloc(sizeof(XGlyphInfo) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   782
    Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   783
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   784
    if (xginfo == NULL || gid == NULL) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   785
        if (xginfo != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   786
            free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   787
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   788
        if (gid != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   789
            free(gid);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   790
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   791
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   792
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   793
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   794
    if ((glyphInfoPtrs = (jlong *)(*env)->
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   795
        GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   796
    {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   797
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   798
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   799
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   800
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   801
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   802
    if ((pixelData = (unsigned char *)
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   803
        (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   804
    {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   805
        (*env)->ReleasePrimitiveArrayCritical(env,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   806
                                glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   807
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   808
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   809
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   810
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   811
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   812
    for (i=0; i < glyphCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   813
      GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   814
17404
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   815
      // 'jginfo->cellInfo' is of type 'void*'
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   816
      // (see definition of 'GlyphInfo' in fontscalerdefs.h)
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   817
      // 'Glyph' is typedefed to 'unsigned long'
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   818
      // (see http://www.x.org/releases/X11R7.7/doc/libXrender/libXrender.txt)
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   819
      // Maybe we should assert that (sizeof(void*) == sizeof(Glyph)) ?
47af135a3e95 7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
simonis
parents: 12389
diff changeset
   820
      gid[i] = (Glyph) (jginfo->cellInfo);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   821
      xginfo[i].x = (-jginfo->topLeftX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   822
      xginfo[i].y = (-jginfo->topLeftY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   823
      xginfo[i].width = jginfo->width;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   824
      xginfo[i].height = jginfo->height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   825
      xginfo[i].xOff = round(jginfo->advanceX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   826
      xginfo[i].yOff = round(jginfo->advanceY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   827
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   828
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   829
    XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   830
                     (const char*)pixelData, pixelDataLength);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   831
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   832
    (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   833
    (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   834
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   835
    free(xginfo);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   836
    free(gid);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   837
}
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   840
Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   841
 (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
   842
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   843
    if (MAX_PAYLOAD / sizeof(Glyph) < (unsigned)glyphCnt) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   844
        /* glyphCnt too big, payload overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   845
        return;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   846
    }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   847
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   848
    /* 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
   849
     * 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
   850
     * 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
   851
     * 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
   852
     */
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   853
    if (sizeof(jint) == sizeof(Glyph)) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   854
        jint *gids =
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   855
            (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   856
        if (gids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   857
            return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   858
        } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   859
             XRenderFreeGlyphs(awt_display,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   860
                               (GlyphSet)glyphSet, (Glyph *)gids, glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   861
             (*env)->ReleasePrimitiveArrayCritical(env, gidArray,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   862
                                                   gids, JNI_ABORT);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   863
        }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   864
        return;
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   865
    } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   866
        Glyph stack_ids[64];
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   867
        Glyph *gids = NULL;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   868
        jint* jgids = NULL;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   869
        int i;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   870
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   871
        if (glyphCnt <= 64) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   872
            gids = stack_ids;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   873
        } else {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   874
            gids = (Glyph *)malloc(sizeof(Glyph) * glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   875
            if (gids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   876
                return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   877
            }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   878
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   879
        jgids = (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   880
        if (jgids == NULL) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   881
            if (gids != stack_ids) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   882
                free(gids);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   883
            }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   884
            return;
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   885
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   886
        for (i=0; i < glyphCnt; i++) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   887
            gids[i] = jgids[i];
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   888
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   889
        XRenderFreeGlyphs(awt_display,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   890
                          (GlyphSet) glyphSet, gids, glyphCnt);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   891
        (*env)->ReleasePrimitiveArrayCritical(env, gidArray,
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   892
                                              jgids, JNI_ABORT);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   893
        if (gids != stack_ids) {
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   894
            free(gids);
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   895
        }
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   896
    }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   897
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   898
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   899
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   900
Java_sun_java2d_xr_XRBackendNative_XRenderCreateGlyphSetNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   901
 (JNIEnv *env, jclass cls, jlong format) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   902
  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
   903
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   904
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   905
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   906
Java_sun_java2d_xr_XRBackendNative_XRenderCompositeTextNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   907
 (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
   908
  jintArray eltArray, jintArray  glyphIDArray, jint eltCnt, jint glyphCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   909
    jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   910
    jint *ids;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   911
    jint *elts;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   912
    XGlyphElt32 *xelts;
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   913
    unsigned int *xids;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   914
    XGlyphElt32 selts[24];
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   915
    unsigned int sids[256];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   916
    int charCnt = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   917
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   918
    if ((MAX_PAYLOAD / sizeof(XGlyphElt32) < (unsigned)eltCnt)
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   919
        || (MAX_PAYLOAD / sizeof(unsigned int) < (unsigned)glyphCnt)
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   920
        || ((MAX_PAYLOAD - sizeof(XGlyphElt32)*(unsigned)eltCnt) /
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   921
            sizeof(unsigned int) < (unsigned)glyphCnt))
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   922
    {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   923
        /* (eltCnt, glyphCnt) too big, payload overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   924
        return;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   925
    }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
   926
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   927
    if (eltCnt <= 24) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   928
      xelts = &selts[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   929
    }else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   930
      xelts = (XGlyphElt32 *) malloc(sizeof(XGlyphElt32) * eltCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   931
      if (xelts == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   932
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   933
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   934
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   935
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   936
    if (glyphCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   937
      xids = &sids[0];
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   938
    } else {
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   939
      xids = (unsigned int*)malloc(sizeof(unsigned int) * glyphCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   940
      if (xids == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   941
          if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   942
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   943
          }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   944
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   945
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   946
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   947
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   948
    if ((ids = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   949
         (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   950
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   951
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   952
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   953
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   954
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   955
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   956
        return;
5579
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
    if ((elts = (jint *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   959
          (*env)->GetPrimitiveArrayCritical(env, eltArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   960
        (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   961
                                              glyphIDArray, ids, JNI_ABORT);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   962
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   963
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   964
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   965
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   966
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   967
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   968
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   969
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   970
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   971
    for (i=0; i < glyphCnt; i++) {
8944
740a7da888ba 7029934: Xrender: Text is truncated with 64 bit Linux JRE
prr
parents: 8506
diff changeset
   972
      xids[i] = ids[i];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   973
    }
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
    for (i=0; i < eltCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   976
      xelts[i].nchars = elts[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   977
      xelts[i].xOff = elts[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   978
      xelts[i].yOff = elts[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   979
      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
   980
      xelts[i].chars = &xids[charCnt];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   981
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   982
      charCnt += xelts[i].nchars;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   983
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   984
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   985
    XRenderCompositeText32(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   986
                           (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   987
                            0, 0, 0, 0, xelts, eltCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   988
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   989
    (*env)->ReleasePrimitiveArrayCritical(env, glyphIDArray, ids, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   990
    (*env)->ReleasePrimitiveArrayCritical(env, eltArray, elts, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   991
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   992
    if (xelts != &selts[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   993
        free(xelts);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   994
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   995
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   996
    if (xids != &sids[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   997
        free(xids);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   998
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   999
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1000
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1001
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1002
Java_sun_java2d_xr_XRBackendNative_setGCMode
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1003
 (JNIEnv *env, jobject this, jlong gc, jboolean copy) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1004
  GC xgc = (GC) jlong_to_ptr(gc);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1005
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1006
  if (copy == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1007
    XSetFunction(awt_display, xgc, GXcopy);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1008
  } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1009
    XSetFunction(awt_display, xgc, GXxor);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1010
  }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1011
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1012
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1013
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1014
Java_sun_java2d_xr_XRBackendNative_GCRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1015
 (JNIEnv *env, jclass xsd, jint dst, jlong gc,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1016
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1017
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1018
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1019
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1020
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1021
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1022
    if (rectCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1023
      xRects = &sRects[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1024
    } else {
19009
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
  1025
      if (MAXUINT / sizeof(XRectangle) < (unsigned)rectCnt) {
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
  1026
        /* rectCnt too big, integer overflow */
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
  1027
        return;
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
  1028
      }
1f1914231324 8005126: [parfait] #418 - #428 XRBackendNative.c Integer overflow
jchen
parents: 19006
diff changeset
  1029
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1030
      xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1031
      if (xRects == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1032
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1033
      }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1034
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1035
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1036
    if ((rects = (jint*)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1037
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1038
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1039
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1040
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
  1041
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1042
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1043
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1044
    for (i=0; i < rectCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1045
      xRects[i].x = rects[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1046
      xRects[i].y = rects[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1047
      xRects[i].width = rects[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1048
      xRects[i].height = rects[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1049
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1050
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1051
    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
  1052
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1053
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1054
    if (xRects != &sRects[0]) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1055
      free(xRects);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1056
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1057
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1058
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1059
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1060
Java_sun_java2d_xr_XRBackendNative_renderCompositeTrapezoidsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1061
 (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
  1062
 jint dst, jint srcX, jint srcY, jintArray  trapArray) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1063
    jint *traps;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1064
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1065
    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
  1066
      return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1067
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1068
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1069
    XRenderCompositeTrapezoids(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1070
                               (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1071
                               srcX, srcY, (XTrapezoid *) (traps+5), traps[0]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1072
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1073
    (*env)->ReleasePrimitiveArrayCritical(env, trapArray, traps, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
  1074
}