jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c
author ohair
Wed, 06 Apr 2011 22:06:11 -0700
changeset 9035 1255eb81cc2f
parent 8506 04d00feba488
child 9050 26c2c1de1631
permissions -rw-r--r--
7033660: Update copyright year to 2011 on any files changed in 2011 Reviewed-by: dholmes
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    69
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    70
/* 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
    71
#include <dlfcn.h>
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
    72
#include <link.h>
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   107
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   108
static jboolean IsXRenderAvailable() {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   109
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   110
    void *xrenderlib;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   111
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   112
    int major_opcode, first_event, first_error;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   113
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   114
    if (!XQueryExtension(awt_display, "RENDER",
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   115
                         &major_opcode, &first_event, &first_error)) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   116
        return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   117
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   118
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   119
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   120
    xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   121
    if (xrenderlib != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   122
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   123
        XRenderCreateLinearGradientFunc =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   124
            (XRenderCreateLinearGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   125
            dlsym(xrenderlib, "XRenderCreateLinearGradient");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   126
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   127
        XRenderCreateRadialGradientFunc =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   128
            (XRenderCreateRadialGradientFuncType)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   129
            dlsym(xrenderlib, "XRenderCreateRadialGradient");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   130
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   131
        if (XRenderCreateLinearGradientFunc == NULL ||
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   132
            XRenderCreateRadialGradientFunc == NULL)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   133
        {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   134
            dlclose(xrenderlib);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   135
            return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   136
        }
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
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   139
    return JNI_TRUE;
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
/*
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   142
 * Class:     sun_awt_X11GraphicsEnvironment
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   143
 * Method:    initGLX
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   144
 * Signature: ()Z
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
JNIEXPORT jboolean JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   147
Java_sun_awt_X11GraphicsEnvironment_initXRender
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   148
 (JNIEnv *env, jclass x11ge)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   149
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   150
#ifndef HEADLESS
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   151
    static jboolean xrenderAvailable = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   152
    static jboolean firstTime = JNI_TRUE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   153
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   154
    if (firstTime) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   155
        AWT_LOCK();
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   156
        xrenderAvailable = IsXRenderAvailable();
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   157
        AWT_UNLOCK();
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   158
        firstTime = JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   159
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   160
    return xrenderAvailable;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   161
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   162
    return JNI_FALSE;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   163
#endif /* !HEADLESS */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   164
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   165
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   166
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   167
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   168
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
   169
    char *maskData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   170
    XImage* defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   171
    jfieldID maskImgID;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   172
    jlong fmt8 =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   173
        ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   174
    jlong fmt32 =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   175
       ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   176
    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
   177
    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
   178
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   179
    (*env)->SetStaticLongField(env, cls, a8ID, fmt8);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   180
    (*env)->SetStaticLongField(env, cls, argb32ID, fmt32);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   181
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   182
    maskData = (char *) malloc(32*32);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   183
    if (maskData == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   184
       return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   185
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   186
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   187
    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
   188
    defaultImg->data = maskData; //required?
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   189
    maskImgID = (*env)->GetStaticFieldID(env, cls, "MASK_XIMG", "J");
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   190
    (*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
   191
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   192
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   193
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   194
Java_sun_java2d_xr_XRBackendNative_freeGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   195
 (JNIEnv *env, jobject this, jlong gc) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   196
    XFreeGC(awt_display, (GC) jlong_to_ptr(gc));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   197
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   198
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   199
JNIEXPORT jlong JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   200
Java_sun_java2d_xr_XRBackendNative_createGC
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   201
 (JNIEnv *env, jobject this, jint drawable) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   202
  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
   203
  return ptr_to_jlong(xgc);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   204
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   205
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   206
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   207
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
   208
                                                jint drawable, jint depth,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   209
                                                jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   210
    return (jint) XCreatePixmap(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   211
                                width, height, depth);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   212
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   213
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   214
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   215
Java_sun_java2d_xr_XRBackendNative_createPictureNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   216
 (JNIEnv *env, jclass cls, jint drawable, jlong formatPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   217
  XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   218
  return XRenderCreatePicture(awt_display, (Drawable) drawable,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   219
                              (XRenderPictFormat *) jlong_to_ptr(formatPtr),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   220
                               0, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   221
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   222
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   223
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   224
Java_sun_java2d_xr_XRBackendNative_freePicture
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   225
 (JNIEnv *env, jobject this, jint picture) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   226
      XRenderFreePicture(awt_display, (Picture) picture);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   227
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   228
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   229
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   230
Java_sun_java2d_xr_XRBackendNative_freePixmap
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   231
 (JNIEnv *env, jobject this, jint pixmap) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   232
   XFreePixmap(awt_display, (Pixmap) pixmap);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   233
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   234
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   235
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   236
Java_sun_java2d_xr_XRBackendNative_setPictureRepeat
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   237
 (JNIEnv *env, jobject this, jint picture, jint repeat) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   238
    XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   239
    pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   240
    XRenderChangePicture (awt_display, (Picture) picture, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   241
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   242
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   243
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   244
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   245
Java_sun_java2d_xr_XRBackendNative_setGCExposures
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   246
 (JNIEnv *env, jobject this, jlong gc, jboolean exposure) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   247
    XSetGraphicsExposures(awt_display,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   248
                         (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
   249
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   250
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   251
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   252
Java_sun_java2d_xr_XRBackendNative_setGCForeground
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   253
 (JNIEnv *env, jobject this, jlong gc, jint pixel) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   254
    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
   255
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   256
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   259
Java_sun_java2d_xr_XRBackendNative_copyArea
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   260
 (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
   261
  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
   262
    XCopyArea(awt_display, (Drawable) src, (Drawable) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   263
             (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
   264
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   265
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   266
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   267
Java_sun_java2d_xr_XRBackendNative_renderComposite
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   268
 (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
   269
  jint srcX, jint srcY, jint maskX, jint maskY,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   270
  jint dstX, jint dstY, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   271
    XRenderComposite (awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   272
                      (Picture)src, (Picture)mask, (Picture)dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   273
                       srcX, srcY, maskX, maskY, dstX, dstY, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   274
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   275
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   276
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   277
Java_sun_java2d_xr_XRBackendNative_renderRectangle
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   278
 (JNIEnv *env, jobject this, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   279
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   280
  jint x, jint y, jint width, jint height) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   281
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   282
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   283
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   284
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   285
    color.blue = blue;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   286
    XRenderFillRectangle(awt_display, op, (Picture) dst, &color,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   287
                         x, y, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   288
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   289
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   290
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   291
Java_sun_java2d_xr_XRBackendNative_XRenderRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   292
 (JNIEnv *env, jclass xsd, jint dst, jbyte op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   293
  jshort red, jshort green, jshort blue, jshort alpha,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   294
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   295
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   296
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   297
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   298
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   299
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   300
    XRenderColor color;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   301
    color.alpha = alpha;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   302
    color.red = red;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   303
    color.green = green;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   304
    color.blue = blue;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   305
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   306
    if (rectCnt <= 256) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   307
        xRects = &sRects[0];
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   308
    } else {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   309
        xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   310
        if (xRects == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   311
            return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   312
        }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   313
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   314
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   315
    if ((rects = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   316
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   317
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   318
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   319
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   320
        return;
5579
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   323
    for (i=0; i < rectCnt; i++) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   324
        xRects[i].x = rects[i*4 + 0];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   325
        xRects[i].y = rects[i*4 + 1];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   326
        xRects[i].width = rects[i*4 + 2];
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   327
        xRects[i].height = rects[i*4 + 3];
5579
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
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   330
    XRenderFillRectangles(awt_display, op,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   331
                          (Picture) dst, &color, xRects, rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   332
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   333
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   334
    if (xRects != &sRects[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   335
        free(xRects);
5579
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
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   338
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   339
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   340
Java_sun_java2d_xr_XRBackendNative_XRSetTransformNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   341
 (JNIEnv *env, jclass xsd, jint pic,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   342
  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
   343
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   344
  XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   345
  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
   346
  XRenderSetPictureTransform (awt_display, (Picture) pic, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   347
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   348
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   349
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   350
Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   351
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   352
     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
   353
     jint numStops, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   354
     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
   355
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   356
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   357
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   358
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   359
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   360
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   361
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   362
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   363
   XLinearGradient grad;
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
   if ((pixels = (jshort *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   366
        (*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   367
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   368
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   369
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   370
       (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   371
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   372
                                              pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   373
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   374
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   375
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   376
    grad.p1.x = x1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   377
    grad.p1.y = y1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   378
    grad.p2.x = x2;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   379
    grad.p2.y = y2;
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
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   382
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   383
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   384
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   385
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   386
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   387
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   388
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   389
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   390
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   391
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   392
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   393
    if (XRenderCreateLinearGradientFunc!=NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   394
      gradient = (*XRenderCreateLinearGradientFunc)(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   395
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   396
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   397
    gradient = XRenderCreateLinearGradient(awt_display, &grad, stops, colors, numStops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   398
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   399
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   400
    free(stops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   401
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   402
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   403
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   404
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   405
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   406
        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
   407
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   408
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   409
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   410
    }
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
   return (jint) gradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   413
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   414
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   415
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   416
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   417
Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   418
    (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   419
     jshortArray pixelsArray, jint numStops,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   420
     jint innerRadius, jint outerRadius, jint repeat,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   421
     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
   422
   jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   423
   jshort* pixels;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   424
   jfloat* fractions;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   425
   XTransform tr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   426
   XRenderPictureAttributes pict_attr;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   427
   Picture gradient = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   428
   XRenderColor *colors;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   429
   XFixed *stops;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   430
   XRadialGradient grad;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   431
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   432
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   433
   if ((pixels =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   434
       (jshort *)(*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   435
       return -1;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   436
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   437
   if ((fractions = (jfloat *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   438
        (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   439
       (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   440
                                             pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   441
       return -1; //TODO release pixels first
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   442
   }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   443
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   444
    grad.inner.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   445
    grad.inner.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   446
    grad.inner.radius = innerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   447
    grad.outer.x = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   448
    grad.outer.y = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   449
    grad.outer.radius = outerRadius;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   450
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   451
    /*TODO optimized & malloc check*/
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   452
    colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   453
    stops =  (XFixed *) malloc(numStops * sizeof(XFixed));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   454
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   455
    for (i=0; i < numStops; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   456
      stops[i] = XDoubleToFixed(fractions[i]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   457
      colors[i].alpha = pixels[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   458
      colors[i].red = pixels[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   459
      colors[i].green = pixels[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   460
      colors[i].blue = pixels[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   461
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   462
#ifdef __solaris__
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   463
    if (XRenderCreateRadialGradientFunc != NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   464
        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
   465
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   466
#else
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   467
    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
   468
#endif
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   469
    free(colors);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   470
    free(stops);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   471
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   472
   (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   473
   (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
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
    if (gradient != 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   477
        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
   478
        XRenderSetPictureTransform (awt_display, gradient, &tr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   479
        pict_attr.repeat = repeat;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   480
        XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   481
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   482
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   483
   return (jint) gradient;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   484
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   485
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   486
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   487
Java_sun_java2d_xr_XRBackendNative_setFilter
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   488
 (JNIEnv *env, jobject this, jint picture, jint filter) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   489
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   490
  char * filterName = "fast";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   491
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   492
  switch(filter) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   493
    case 0:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   494
      filterName = "fast";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   495
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   496
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   497
    case 1:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   498
      filterName = "good";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   499
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   500
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   501
    case 2:
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   502
      filterName = "best";
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   503
      break;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   504
  }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   505
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   506
    XRenderSetPictureFilter(awt_display, (Picture) picture, filterName, NULL, 0);
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
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   510
Java_sun_java2d_xr_XRBackendNative_XRSetClipNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   511
    (JNIEnv *env, jclass xsd, jlong dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   512
     jint x1, jint y1, jint x2, jint y2,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   513
     jobject complexclip, jboolean isGC)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   514
{
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   515
    int numrects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   516
    XRectangle rects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   517
    XRectangle *pRect = rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   518
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   519
    numrects = RegionToYXBandedRectangles(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   520
            x1, y1, x2, y2, complexclip,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   521
            &pRect, 256);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   522
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   523
    if (isGC == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   524
      if (dst != (jlong) 0) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   525
          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
   526
      }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   527
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   528
       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
   529
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   530
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   531
    if (pRect != rects) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   532
        free(pRect);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   533
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   534
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   535
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   536
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   537
Java_sun_java2d_xr_XRBackendNative_putMaskNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   538
 (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
   539
  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
   540
  jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   541
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   542
    int line, pix;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   543
    char *mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   544
    char *defaultData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   545
    XImage *defaultImg, *img;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   546
    jboolean imageFits;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   547
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   548
    if ((mask = (char *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   549
         (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   550
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   551
     }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   552
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   553
    defaultImg = (XImage *) jlong_to_ptr(imgPtr);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   554
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   555
    if (ea != 1.0f) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   556
        for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   557
            for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   558
                int index = maskScan*line + pix + maskOff;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   559
                mask[index] = (((unsigned char) mask[index])*ea);
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
        }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   562
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   563
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   564
    /*
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   565
    * 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
   566
    * 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
   567
    *    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
   568
    * 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
   569
    *    allocated.
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   570
    * 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
   571
    */
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   572
    defaultData = defaultImg->data;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   573
    img = defaultImg;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   574
    imageFits = defaultImg->width >= width && defaultImg->height >= height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   575
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   576
    if (imageFits &&
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   577
        maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   578
        defaultImg->data = mask;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   579
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   580
        if (imageFits) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   581
            for (line=0; line < height; line++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   582
                for (pix=0; pix < width; pix++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   583
                    img->data[line*img->bytes_per_line + pix] =
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   584
                        (unsigned char) (mask[maskScan*line + pix + maskOff]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   585
                }
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
        } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   588
            img = XCreateImage(awt_display, NULL, 8, ZPixmap,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   589
                               maskOff, mask, maskScan, height, 8, 0);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   590
        }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   591
    }
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
    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
   594
              img, 0, 0, 0, 0, width, height);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   595
    (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   596
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   597
    if (img != defaultImg) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   598
        img->data = NULL;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   599
        XDestroyImage(img);
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
    defaultImg->data = defaultData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   602
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   603
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   604
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   605
Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   606
 (JNIEnv *env, jclass cls, jint glyphSet,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   607
  jlongArray glyphInfoPtrsArray, jint glyphCnt,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   608
  jbyteArray pixelDataArray, int pixelDataLength) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   609
    jlong *glyphInfoPtrs;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   610
    unsigned char *pixelData;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   611
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   612
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   613
    XGlyphInfo *xginfo = (XGlyphInfo *) malloc(sizeof(XGlyphInfo) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   614
    Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   615
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   616
    if (xginfo == NULL || gid == NULL) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   617
        if (xginfo != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   618
            free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   619
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   620
        if (gid != NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   621
            free(gid);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   622
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   623
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   624
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   625
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   626
    if ((glyphInfoPtrs = (jlong *)(*env)->
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   627
        GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   628
    {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   629
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   630
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   631
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   632
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   633
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   634
    if ((pixelData = (unsigned char *)
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   635
        (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   636
    {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   637
        (*env)->ReleasePrimitiveArrayCritical(env,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   638
                                glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   639
        free(xginfo);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   640
        free(gid);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   641
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   642
    }
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
    for (i=0; i < glyphCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   645
      GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
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
      gid[i] = (Glyph) (0xffffffff & ((unsigned int) jginfo->cellInfo));
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   648
      xginfo[i].x = (-jginfo->topLeftX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   649
      xginfo[i].y = (-jginfo->topLeftY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   650
      xginfo[i].width = jginfo->width;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   651
      xginfo[i].height = jginfo->height;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   652
      xginfo[i].xOff = round(jginfo->advanceX);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   653
      xginfo[i].yOff = round(jginfo->advanceY);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   654
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   655
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   656
    XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   657
                     (const char*)pixelData, pixelDataLength);
5579
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
    (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   660
    (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   661
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   662
    free(xginfo);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   663
    free(gid);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   664
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   665
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   666
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   667
Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   668
 (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
   669
    jint *gids;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   670
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   671
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   672
    if ((gids = (jint *) (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   673
        return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   674
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   675
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   676
    XRenderFreeGlyphs (awt_display, (GlyphSet) glyphSet, (Glyph *) gids, glyphCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   677
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   678
    (*env)->ReleasePrimitiveArrayCritical(env, gidArray, gids, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   679
}
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
JNIEXPORT jint JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   682
Java_sun_java2d_xr_XRBackendNative_XRenderCreateGlyphSetNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   683
 (JNIEnv *env, jclass cls, jlong format) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   684
  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
   685
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   686
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   687
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   688
Java_sun_java2d_xr_XRBackendNative_XRenderCompositeTextNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   689
 (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
   690
  jintArray eltArray, jintArray  glyphIDArray, jint eltCnt, jint glyphCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   691
    jint i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   692
    jint *ids;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   693
    jint *elts;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   694
    XGlyphElt32 *xelts;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   695
    Glyph *xids;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   696
    XGlyphElt32 selts[24];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   697
    Glyph sids[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   698
    int charCnt = 0;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   699
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   700
    if (eltCnt <= 24) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   701
      xelts = &selts[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   702
    }else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   703
      xelts = (XGlyphElt32 *) malloc(sizeof(XGlyphElt32) * eltCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   704
      if (xelts == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   705
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   706
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   707
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   708
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   709
    if (glyphCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   710
      xids = &sids[0];
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   711
    } else {
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   712
      xids = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   713
      if (xids == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   714
          if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   715
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   716
          }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   717
          return;
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   718
      }
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   719
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   720
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   721
    if ((ids = (jint *)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   722
         (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   723
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   724
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   725
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   726
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   727
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   728
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   729
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   730
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   731
    if ((elts = (jint *)
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   732
          (*env)->GetPrimitiveArrayCritical(env, eltArray, NULL)) == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   733
        (*env)->ReleasePrimitiveArrayCritical(env,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   734
                                              glyphIDArray, ids, JNI_ABORT);
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   735
        if (xelts != &selts[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   736
            free(xelts);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   737
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   738
        if (xids != &sids[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   739
            free(xids);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   740
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   741
        return;
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   742
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   743
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   744
    for (i=0; i < glyphCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   745
      xids[i] = (Glyph) ids[i];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   746
    }
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
    for (i=0; i < eltCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   749
      xelts[i].nchars = elts[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   750
      xelts[i].xOff = elts[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   751
      xelts[i].yOff = elts[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   752
      xelts[i].glyphset = (GlyphSet) elts[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   753
      xelts[i].chars = (unsigned int *) &xids[charCnt];
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
      charCnt += xelts[i].nchars;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   756
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   757
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   758
    XRenderCompositeText32(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   759
                           (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   760
                            0, 0, 0, 0, xelts, eltCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   761
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   762
    (*env)->ReleasePrimitiveArrayCritical(env, glyphIDArray, ids, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   763
    (*env)->ReleasePrimitiveArrayCritical(env, eltArray, elts, JNI_ABORT);
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
    if (xelts != &selts[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   766
        free(xelts);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   767
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   768
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   769
    if (xids != &sids[0]) {
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   770
        free(xids);
5579
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   771
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   772
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   773
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   774
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   775
Java_sun_java2d_xr_XRBackendNative_setGCMode
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   776
 (JNIEnv *env, jobject this, jlong gc, jboolean copy) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   777
  GC xgc = (GC) jlong_to_ptr(gc);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   778
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   779
  if (copy == JNI_TRUE) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   780
    XSetFunction(awt_display, xgc, GXcopy);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   781
  } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   782
    XSetFunction(awt_display, xgc, GXxor);
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
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   785
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   786
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   787
Java_sun_java2d_xr_XRBackendNative_GCRectanglesNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   788
 (JNIEnv *env, jclass xsd, jint dst, jlong gc,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   789
  jintArray rectArray, jint rectCnt) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   790
    int i;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   791
    jint* rects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   792
    XRectangle *xRects;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   793
    XRectangle sRects[256];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   794
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   795
    if (rectCnt <= 256) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   796
      xRects = &sRects[0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   797
    } else {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   798
      xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   799
      if (xRects == NULL) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   800
        return;
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
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   803
8506
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   804
    if ((rects = (jint*)
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   805
         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   806
        if (xRects != &sRects[0]) {
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   807
            free(xRects);
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   808
        }
04d00feba488 7004728: [parfait] potential memory leaks in XRender code
prr
parents: 7933
diff changeset
   809
        return;
5579
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 < rectCnt; i++) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   813
      xRects[i].x = rects[i*4 + 0];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   814
      xRects[i].y = rects[i*4 + 1];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   815
      xRects[i].width = rects[i*4 + 2];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   816
      xRects[i].height = rects[i*4 + 3];
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   817
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   818
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   819
    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
   820
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   821
    (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   822
    if (xRects != &sRects[0]) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   823
      free(xRects);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   824
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   825
}
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   826
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   827
JNIEXPORT void JNICALL
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   828
Java_sun_java2d_xr_XRBackendNative_renderCompositeTrapezoidsNative
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   829
 (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
   830
 jint dst, jint srcX, jint srcY, jintArray  trapArray) {
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   831
    jint *traps;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   832
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   833
    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
   834
      return;
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   835
    }
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   836
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   837
    XRenderCompositeTrapezoids(awt_display, op, (Picture) src, (Picture) dst,
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   838
                               (XRenderPictFormat *) jlong_to_ptr(maskFmt),
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   839
                               srcX, srcY, (XTrapezoid *) (traps+5), traps[0]);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   840
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   841
    (*env)->ReleasePrimitiveArrayCritical(env, trapArray, traps, JNI_ABORT);
1a5e995a710b 6307603: [X11] Use RENDER extension for complex operations done in software
ceisserer
parents:
diff changeset
   842
}