1 /*
   2  * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #ifndef GraphicsPrimitiveMgr_h_Included
  27 #define GraphicsPrimitiveMgr_h_Included
  28 
  29 #ifdef __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 #include <stddef.h>
  34 #include "jni.h"
  35 
  36 #include "java_awt_AlphaComposite.h"
  37 
  38 #include "SurfaceData.h"
  39 #include "SpanIterator.h"
  40 
  41 #include "j2d_md.h"
  42 
  43 #include "AlphaMath.h"
  44 #include "GlyphImageRef.h"
  45 
  46 /*
  47  * This structure contains all of the information about a particular
  48  * type of GraphicsPrimitive, such as a FillRect, a MaskFill, or a Blit.
  49  *
  50  * A global collection of these structures is declared and initialized
  51  * to contain the necessary Java (JNI) information so that appropriate
  52  * Java GraphicsPrimitive objects can be quickly constructed for a set
  53  * of native loops simply by referencing the necessary entry from that
  54  * collection for the type of primitive being registered.
  55  *
  56  * See PrimitiveTypes.{Blit,BlitBg,FillRect,...} below.
  57  */
  58 typedef struct _PrimitiveType {
  59     char                *ClassName;
  60     jint                srcflags;
  61     jint                dstflags;
  62     jclass              ClassObject;
  63     jmethodID           Constructor;
  64 } PrimitiveType;
  65 
  66 /* The integer constants to identify the compositing rule being defined. */
  67 #define RULE_Xor        (java_awt_AlphaComposite_MIN_RULE - 1)
  68 #define RULE_Clear      java_awt_AlphaComposite_CLEAR
  69 #define RULE_Src        java_awt_AlphaComposite_SRC
  70 #define RULE_SrcOver    java_awt_AlphaComposite_SRC_OVER
  71 #define RULE_DstOver    java_awt_AlphaComposite_DST_OVER
  72 #define RULE_SrcIn      java_awt_AlphaComposite_SRC_IN
  73 #define RULE_DstIn      java_awt_AlphaComposite_DST_IN
  74 #define RULE_SrcOut     java_awt_AlphaComposite_SRC_OUT
  75 #define RULE_DstOut     java_awt_AlphaComposite_DST_OUT
  76 
  77 /*
  78  * This structure holds the information retrieved from a Java
  79  * Composite object for easy transfer to various C functions
  80  * that implement the inner loop for a native primitive.
  81  *
  82  * Currently only AlphaComposite and XORComposite are supported.
  83  */
  84 typedef struct _CompositeInfo {
  85     jint        rule;           /* See RULE_* constants above */
  86     union {
  87         jfloat  extraAlpha;     /* from AlphaComposite */
  88         jint    xorPixel;       /* from XORComposite */
  89     } details;
  90     juint       alphaMask;      /* from XORComposite */
  91 } CompositeInfo;
  92 
  93 /*
  94  * This structure is the common header for the two native structures
  95  * that hold information about a particular SurfaceType or CompositeType.
  96  *
  97  * A global collection of these structures is declared and initialized
  98  * to contain the necessary Java (JNI) information so that appropriate
  99  * Java GraphicsPrimitive objects can be quickly constructed for a set
 100  * of native loops simply by referencing the necessary entry from that
 101  * collection for the type of composite or surface being implemented.
 102  *
 103  * See SurfaceTypes.{OpaqueColor,IntArgb,ByteGray,...} below.
 104  * See CompositeTypes.{Xor,AnyAlpha,...} below.
 105  */
 106 typedef struct _SurfCompHdr {
 107     char                *Name;
 108     jobject             Object;
 109 } SurfCompHdr;
 110 
 111 /*
 112  * The definitions for the SurfaceType structure described above.
 113  */
 114 
 115 /*
 116  * The signature for a function that returns the specific integer
 117  * format pixel for a given ARGB color value for a particular
 118  * SurfaceType implementation.
 119  * This function is valid only after GetRasInfo call for the
 120  * associated surface.
 121  */
 122 typedef jint (PixelForFunc)(SurfaceDataRasInfo *pRasInfo, jint rgb);
 123 
 124 /*
 125  * The additional information needed to manipulate a surface:
 126  * - The pixelFor function for translating ARGB values.
 127  *   Valid only after GetRasInfo call for this surface.
 128  * - The additional flags needed when reading from this surface.
 129  * - The additional flags needed when writing to this surface.
 130  */
 131 typedef struct _SurfaceType {
 132     SurfCompHdr         hdr;
 133     PixelForFunc        *pixelFor;
 134     jint                readflags;
 135     jint                writeflags;
 136 } SurfaceType;
 137 
 138 /*
 139  * The definitions for the CompositeType structure described above.
 140  */
 141 
 142 /*
 143  * The signature for a function that fills in a CompositeInfo
 144  * structure from the information present in a given Java Composite
 145  * object.
 146  */
 147 typedef void (JNICALL CompInfoFunc)(JNIEnv *env,
 148                                     CompositeInfo *pCompInfo,
 149                                     jobject Composite);
 150 
 151 /*
 152  * The additional information needed to implement a primitive that
 153  * performs a particular composite operation:
 154  * - The getCompInfo function for filling in a CompositeInfo structure.
 155  * - The additional flags needed for locking the destination surface.
 156  */
 157 typedef struct _CompositeType {
 158     SurfCompHdr         hdr;
 159     CompInfoFunc        *getCompInfo;
 160     jint                dstflags;
 161 } CompositeType;
 162 
 163 /*
 164  * The signature of the native functions that register a set of
 165  * related native GraphicsPrimitive functions.
 166  */
 167 typedef jboolean (RegisterFunc)(JNIEnv *env);
 168 
 169 struct _NativePrimitive;        /* forward reference for function typedefs */
 170 
 171 /*
 172  * This empty function signature represents an "old pre-ANSI style"
 173  * function declaration which makes no claims about the argument list
 174  * other than that the types of the arguments will undergo argument
 175  * promotion in the calling conventions.
 176  * (See section A7.3.2 in K&R 2nd edition.)
 177  *
 178  * When trying to statically initialize the function pointer field of
 179  * a NativePrimitive structure, which is a union of all possible
 180  * inner loop function signatures, the initializer constant must be
 181  * compatible with the first field in the union.  This generic function
 182  * type allows us to assign any function pointer to that union as long
 183  * as it meets the requirements specified above (i.e. all arguments
 184  * are compatible with their promoted values according to the old
 185  * style argument promotion calling semantics).
 186  *
 187  * Note: This means that you cannot define an argument to any of
 188  * these native functions which is a byte or a short as that value
 189  * would not be passed in the same way for an ANSI-style full prototype
 190  * calling convention and an old-style argument promotion calling
 191  * convention.
 192  */
 193 typedef void (AnyFunc)();
 194 
 195 /*
 196  * The signature of the inner loop function for a "Blit".
 197  */
 198 typedef void (BlitFunc)(void *pSrc, void *pDst,
 199                         juint width, juint height,
 200                         SurfaceDataRasInfo *pSrcInfo,
 201                         SurfaceDataRasInfo *pDstInfo,
 202                         struct _NativePrimitive *pPrim,
 203                         CompositeInfo *pCompInfo);
 204 
 205 /*
 206  * The signature of the inner loop function for a "BlitBg".
 207  */
 208 typedef void (BlitBgFunc)(void *pSrc, void *pDst,
 209                           juint width, juint height, jint bgpixel,
 210                           SurfaceDataRasInfo *pSrcInfo,
 211                           SurfaceDataRasInfo *pDstInfo,
 212                           struct _NativePrimitive *pPrim,
 213                           CompositeInfo *pCompInfo);
 214 
 215 /*
 216  * The signature of the inner loop function for a "ScaleBlit".
 217  */
 218 typedef void (ScaleBlitFunc)(void *pSrc, void *pDst,
 219                              juint dstwidth, juint dstheight,
 220                              jint sxloc, jint syloc,
 221                              jint sxinc, jint syinc, jint scale,
 222                              SurfaceDataRasInfo *pSrcInfo,
 223                              SurfaceDataRasInfo *pDstInfo,
 224                              struct _NativePrimitive *pPrim,
 225                              CompositeInfo *pCompInfo);
 226 
 227 /*
 228  * The signature of the inner loop function for a "FillRect".
 229  */
 230 typedef void (FillRectFunc)(SurfaceDataRasInfo *pRasInfo,
 231                             jint lox, jint loy,
 232                             jint hix, jint hiy,
 233                             jint pixel, struct _NativePrimitive *pPrim,
 234                             CompositeInfo *pCompInfo);
 235 
 236 /*
 237  * The signature of the inner loop function for a "FillSpans".
 238  */
 239 typedef void (FillSpansFunc)(SurfaceDataRasInfo *pRasInfo,
 240                              SpanIteratorFuncs *pSpanFuncs, void *siData,
 241                              jint pixel, struct _NativePrimitive *pPrim,
 242                              CompositeInfo *pCompInfo);
 243 
 244 /*
 245  * The signature of the inner loop function for a "DrawLine".
 246  * Note that this same inner loop is used for native DrawRect
 247  * and DrawPolygons primitives.
 248  */
 249 typedef void (DrawLineFunc)(SurfaceDataRasInfo *pRasInfo,
 250                             jint x1, jint y1, jint pixel,
 251                             jint steps, jint error,
 252                             jint bumpmajormask, jint errmajor,
 253                             jint bumpminormask, jint errminor,
 254                             struct _NativePrimitive *pPrim,
 255                             CompositeInfo *pCompInfo);
 256 
 257 /*
 258  * The signature of the inner loop function for a "MaskFill".
 259  */
 260 typedef void (MaskFillFunc)(void *pRas,
 261                             unsigned char *pMask, jint maskOff, jint maskScan,
 262                             jint width, jint height,
 263                             jint fgColor,
 264                             SurfaceDataRasInfo *pRasInfo,
 265                             struct _NativePrimitive *pPrim,
 266                             CompositeInfo *pCompInfo);
 267 
 268 /*
 269  * The signature of the inner loop function for a "MaskBlit".
 270  */
 271 typedef void (MaskBlitFunc)(void *pDst, void *pSrc,
 272                             unsigned char *pMask, jint maskOff, jint maskScan,
 273                             jint width, jint height,
 274                             SurfaceDataRasInfo *pDstInfo,
 275                             SurfaceDataRasInfo *pSrcInfo,
 276                             struct _NativePrimitive *pPrim,
 277                             CompositeInfo *pCompInfo);
 278 /*
 279  * The signature of the inner loop function for a "DrawGlyphList".
 280  */
 281 typedef void (DrawGlyphListFunc)(SurfaceDataRasInfo *pRasInfo,
 282                                  ImageRef *glyphs,
 283                                  jint totalGlyphs,
 284                                  jint fgpixel, jint fgcolor,
 285                                  jint cx1, jint cy1,
 286                                  jint cx2, jint cy2,
 287                                  struct _NativePrimitive *pPrim,
 288                                  CompositeInfo *pCompInfo);
 289 
 290 /*
 291  * The signature of the inner loop function for a "DrawGlyphListAA".
 292  */
 293 typedef void (DrawGlyphListAAFunc)(SurfaceDataRasInfo *pRasInfo,
 294                                    ImageRef *glyphs,
 295                                    jint totalGlyphs,
 296                                    jint fgpixel, jint fgcolor,
 297                                    jint cx1, jint cy1,
 298                                    jint cx2, jint cy2,
 299                                    struct _NativePrimitive *pPrim,
 300                                    CompositeInfo *pCompInfo);
 301 
 302 /*
 303  * The signature of the inner loop function for a "DrawGlyphListLCD".
 304  * rgbOrder is a jint rather than a jboolean so that this typedef matches
 305  * AnyFunc which is the first element in a union in NativePrimitive's
 306  * initialiser. See the comments alongside declaration of the AnyFunc type for
 307  * a full explanation.
 308  */
 309 typedef void (DrawGlyphListLCDFunc)(SurfaceDataRasInfo *pRasInfo,
 310                                     ImageRef *glyphs,
 311                                     jint totalGlyphs,
 312                                     jint fgpixel, jint fgcolor,
 313                                     jint cx1, jint cy1,
 314                                     jint cx2, jint cy2,
 315                                     jint rgbOrder,
 316                                     unsigned char *gammaLut,
 317                                     unsigned char *invGammaLut,
 318                                     struct _NativePrimitive *pPrim,
 319                                     CompositeInfo *pCompInfo);
 320 
 321 /*
 322  * The signature of the inner loop functions for a "TransformHelper".
 323  */
 324 typedef void (TransformHelperFunc)(SurfaceDataRasInfo *pSrcInfo,
 325                                    jint *pRGB, jint numpix,
 326                                    jlong xlong, jlong dxlong,
 327                                    jlong ylong, jlong dylong);
 328 
 329 typedef struct {
 330     TransformHelperFunc         *nnHelper;
 331     TransformHelperFunc         *blHelper;
 332     TransformHelperFunc         *bcHelper;
 333 } TransformHelperFuncs;
 334 
 335 typedef void (TransformInterpFunc)(jint *pRGBbase, jint numpix,
 336                                    jint xfract, jint dxfract,
 337                                    jint yfract, jint dyfract);
 338 
 339 /*
 340  * The signature of the inner loop function for a "FillParallelogram"
 341  * Note that this same inner loop is used for native DrawParallelogram
 342  * primitives.
 343  * Note that these functions are paired with equivalent DrawLine
 344  * inner loop functions to facilitate nicer looking and faster thin
 345  * transformed drawrect calls.
 346  */
 347 typedef void (FillParallelogramFunc)(SurfaceDataRasInfo *pRasInfo,
 348                                      jint lox, jint loy, jint hix, jint hiy,
 349                                      jlong leftx, jlong dleftx,
 350                                      jlong rightx, jlong drightx,
 351                                      jint pixel, struct _NativePrimitive *pPrim,
 352                                      CompositeInfo *pCompInfo);
 353 
 354 typedef struct {
 355     FillParallelogramFunc       *fillpgram;
 356     DrawLineFunc                *drawline;
 357 } DrawParallelogramFuncs;
 358 
 359 /*
 360  * This structure contains all information for defining a single
 361  * native GraphicsPrimitive, including:
 362  * - The information about the type of the GraphicsPrimitive subclass.
 363  * - The information about the type of the source surface.
 364  * - The information about the type of the compositing operation.
 365  * - The information about the type of the destination surface.
 366  * - A pointer to the function that performs the actual inner loop work.
 367  * - Extra flags needed for locking the source and destination surfaces
 368  *   above and beyond the flags specified in the Primitive, Composite
 369  *   and SurfaceType structures.  (For most native primitives these
 370  *   flags can be calculated automatically from information stored in
 371  *   the PrimitiveType, SurfaceType, and CompositeType structures.)
 372  */
 373 typedef struct _NativePrimitive {
 374     PrimitiveType       *pPrimType;
 375     SurfaceType         *pSrcType;
 376     CompositeType       *pCompType;
 377     SurfaceType         *pDstType;
 378     /* See declaration of AnyFunc type above for comments explaining why
 379      * only AnyFunc is used by the initializers for these union fields
 380      * and consequent type restrictions.
 381      */
 382     union {
 383         AnyFunc                 *initializer;
 384         BlitFunc                *blit;
 385         BlitBgFunc              *blitbg;
 386         ScaleBlitFunc           *scaledblit;
 387         FillRectFunc            *fillrect;
 388         FillSpansFunc           *fillspans;
 389         FillParallelogramFunc   *fillparallelogram;
 390         DrawParallelogramFuncs  *drawparallelogram;
 391         DrawLineFunc            *drawline;
 392         MaskFillFunc            *maskfill;
 393         MaskBlitFunc            *maskblit;
 394         DrawGlyphListFunc       *drawglyphlist;
 395         DrawGlyphListFunc       *drawglyphlistaa;
 396         DrawGlyphListLCDFunc    *drawglyphlistlcd;
 397         TransformHelperFuncs    *transformhelpers;
 398     } funcs, funcs_c;
 399     jint                srcflags;
 400     jint                dstflags;
 401 } NativePrimitive;
 402 
 403 /*
 404  * This function should be defined to return a pointer to
 405  * an accelerated version of a primitive function 'func_c'
 406  * if it exists and to return a copy of the input parameter
 407  * otherwise.
 408  */
 409 extern AnyFunc* MapAccelFunction(AnyFunc *func_c);
 410 
 411 /*
 412  * The global collection of all primitive types.  Specific NativePrimitive
 413  * structures can be statically initialized by pointing to these structures.
 414  */
 415 extern struct _PrimitiveTypes {
 416     PrimitiveType       Blit;
 417     PrimitiveType       BlitBg;
 418     PrimitiveType       ScaledBlit;
 419     PrimitiveType       FillRect;
 420     PrimitiveType       FillSpans;
 421     PrimitiveType       FillParallelogram;
 422     PrimitiveType       DrawParallelogram;
 423     PrimitiveType       DrawLine;
 424     PrimitiveType       DrawRect;
 425     PrimitiveType       DrawPolygons;
 426     PrimitiveType       DrawPath;
 427     PrimitiveType       FillPath;
 428     PrimitiveType       MaskBlit;
 429     PrimitiveType       MaskFill;
 430     PrimitiveType       DrawGlyphList;
 431     PrimitiveType       DrawGlyphListAA;
 432     PrimitiveType       DrawGlyphListLCD;
 433     PrimitiveType       TransformHelper;
 434 } PrimitiveTypes;
 435 
 436 /*
 437  * The global collection of all surface types.  Specific NativePrimitive
 438  * structures can be statically initialized by pointing to these structures.
 439  */
 440 extern struct _SurfaceTypes {
 441     SurfaceType         OpaqueColor;
 442     SurfaceType         AnyColor;
 443     SurfaceType         AnyByte;
 444     SurfaceType         ByteBinary1Bit;
 445     SurfaceType         ByteBinary2Bit;
 446     SurfaceType         ByteBinary4Bit;
 447     SurfaceType         ByteIndexed;
 448     SurfaceType         ByteIndexedBm;
 449     SurfaceType         ByteGray;
 450     SurfaceType         Index8Gray;
 451     SurfaceType         Index12Gray;
 452     SurfaceType         AnyShort;
 453     SurfaceType         Ushort555Rgb;
 454     SurfaceType         Ushort555Rgbx;
 455     SurfaceType         Ushort565Rgb;
 456     SurfaceType         Ushort4444Argb;
 457     SurfaceType         UshortGray;
 458     SurfaceType         UshortIndexed;
 459     SurfaceType         Any3Byte;
 460     SurfaceType         ThreeByteBgr;
 461     SurfaceType         AnyInt;
 462     SurfaceType         IntArgb;
 463     SurfaceType         IntArgbPre;
 464     SurfaceType         IntArgbBm;
 465     SurfaceType         IntRgb;
 466     SurfaceType         IntBgr;
 467     SurfaceType         IntRgbx;
 468     SurfaceType         Any4Byte;
 469     SurfaceType         FourByteAbgr;
 470     SurfaceType         FourByteAbgrPre;
 471 } SurfaceTypes;
 472 
 473 /*
 474  * The global collection of all composite types.  Specific NativePrimitive
 475  * structures can be statically initialized by pointing to these structures.
 476  */
 477 extern struct _CompositeTypes {
 478     CompositeType       SrcNoEa;
 479     CompositeType       SrcOverNoEa;
 480     CompositeType       SrcOverBmNoEa;
 481     CompositeType       Src;
 482     CompositeType       SrcOver;
 483     CompositeType       Xor;
 484     CompositeType       AnyAlpha;
 485 } CompositeTypes;
 486 
 487 #define ArraySize(A)    (sizeof(A) / sizeof(A[0]))
 488 
 489 #define PtrAddBytes(p, b)               ((void *) (((intptr_t) (p)) + (b)))
 490 #define PtrCoord(p, x, xinc, y, yinc)   PtrAddBytes(p, \
 491                                                     ((ptrdiff_t)(y))*(yinc) + \
 492                                                     ((ptrdiff_t)(x))*(xinc))
 493 
 494 /*
 495  * The function to call with an array of NativePrimitive structures
 496  * to register them with the Java GraphicsPrimitiveMgr.
 497  */
 498 extern jboolean RegisterPrimitives(JNIEnv *env,
 499                                    NativePrimitive *pPrim,
 500                                    jint NumPrimitives);
 501 
 502 /*
 503  * The utility function to retrieve the NativePrimitive structure
 504  * from a given Java GraphicsPrimitive object.
 505  */
 506 extern JNIEXPORT NativePrimitive * JNICALL
 507 GetNativePrim(JNIEnv *env, jobject gp);
 508 
 509 /*
 510  * Utility functions to get values from a Java SunGraphics2D or Color object.
 511  */
 512 extern JNIEXPORT void JNICALL
 513 GrPrim_Sg2dGetCompInfo(JNIEnv *env, jobject sg2d,
 514                        NativePrimitive *pPrim,
 515                        CompositeInfo *pCompInfo);
 516 extern JNIEXPORT jint JNICALL
 517 GrPrim_CompGetXorColor(JNIEnv *env, jobject comp);
 518 extern JNIEXPORT void JNICALL
 519 GrPrim_CompGetXorInfo(JNIEnv *env, CompositeInfo *pCompInfo, jobject comp);
 520 extern JNIEXPORT void JNICALL
 521 GrPrim_CompGetAlphaInfo(JNIEnv *env, CompositeInfo *pCompInfo, jobject comp);
 522 
 523 extern JNIEXPORT void JNICALL
 524 GrPrim_Sg2dGetClip(JNIEnv *env, jobject sg2d,
 525                    SurfaceDataBounds *bounds);
 526 
 527 extern JNIEXPORT jint JNICALL
 528 GrPrim_Sg2dGetPixel(JNIEnv *env, jobject sg2d);
 529 extern JNIEXPORT jint JNICALL
 530 GrPrim_Sg2dGetEaRGB(JNIEnv *env, jobject sg2d);
 531 extern JNIEXPORT jint JNICALL
 532 GrPrim_Sg2dGetLCDTextContrast(JNIEnv *env, jobject sg2d);
 533 
 534 /*
 535  * Data structure and functions to retrieve and use
 536  * AffineTransform objects from the native level.
 537  */
 538 typedef struct {
 539     jdouble dxdx;       /* dx in dest space for each dx in src space */
 540     jdouble dxdy;       /* dx in dest space for each dy in src space */
 541     jdouble tx;
 542     jdouble dydx;       /* dy in dest space for each dx in src space */
 543     jdouble dydy;       /* dy in dest space for each dy in src space */
 544     jdouble ty;
 545 } TransformInfo;
 546 
 547 extern JNIEXPORT void JNICALL
 548 Transform_GetInfo(JNIEnv *env, jobject txform, TransformInfo *pTxInfo);
 549 extern JNIEXPORT void JNICALL
 550 Transform_transform(TransformInfo *pTxInfo, jdouble *pX, jdouble *pY);
 551 
 552 void GrPrim_RefineBounds(SurfaceDataBounds *bounds, jint transX, jint transY,
 553                          jfloat *coords,  jint maxCoords);
 554 
 555 JNIEXPORT extern jfieldID path2DTypesID;
 556 JNIEXPORT extern jfieldID path2DNumTypesID;
 557 JNIEXPORT extern jfieldID path2DWindingRuleID;
 558 JNIEXPORT extern jfieldID path2DFloatCoordsID;
 559 JNIEXPORT extern jfieldID sg2dStrokeHintID;
 560 JNIEXPORT extern jint sunHints_INTVAL_STROKE_PURE;
 561 
 562 /*
 563  * Macros for using jlong variables as 32bits.32bits fractional values
 564  */
 565 #define LongOneHalf     (((jlong) 1) << 31)
 566 #define IntToLong(i)    (((jlong) (i)) << 32)
 567 #define DblToLong(d)    ((jlong) ((d) * IntToLong(1)))
 568 #define LongToDbl(l)    (((jdouble) l) / IntToLong(1))
 569 #define WholeOfLong(l)  ((jint) ((l) >> 32))
 570 #define FractOfLong(l)  ((jint) (l))
 571 #define URShift(i, n)   (((juint) (i)) >> (n))
 572 
 573 /*
 574  * Macros to help in defining arrays of NativePrimitive structures.
 575  *
 576  * These macros are the very base macros.  More specific macros are
 577  * defined in LoopMacros.h.
 578  *
 579  * Note that the DrawLine, DrawRect, and DrawPolygons primitives are
 580  * all registered together from a single shared native function pointer.
 581  */
 582 
 583 #define REGISTER_PRIMITIVE(TYPE, SRC, COMP, DST, FUNC) \
 584     { \
 585         & PrimitiveTypes.TYPE, \
 586         & SurfaceTypes.SRC, \
 587         & CompositeTypes.COMP, \
 588         & SurfaceTypes.DST, \
 589         {FUNC}, \
 590         {FUNC}, \
 591         0,   \
 592         0   \
 593     }
 594 
 595 #define REGISTER_PRIMITIVE_FLAGS(TYPE, SRC, COMP, DST, FUNC, SFLAGS, DFLAGS) \
 596     { \
 597         & PrimitiveTypes.TYPE, \
 598         & SurfaceTypes.SRC, \
 599         & CompositeTypes.COMP, \
 600         & SurfaceTypes.DST, \
 601         {FUNC}, \
 602         {FUNC}, \
 603         SFLAGS, \
 604         DFLAGS, \
 605     }
 606 
 607 #define REGISTER_BLIT(SRC, COMP, DST, FUNC) \
 608     REGISTER_PRIMITIVE(Blit, SRC, COMP, DST, FUNC)
 609 
 610 #define REGISTER_BLIT_FLAGS(SRC, COMP, DST, FUNC, SFLAGS, DFLAGS) \
 611     REGISTER_PRIMITIVE_FLAGS(Blit, SRC, COMP, DST, FUNC, SFLAGS, DFLAGS)
 612 
 613 #define REGISTER_SCALEBLIT(SRC, COMP, DST, FUNC) \
 614     REGISTER_PRIMITIVE(ScaledBlit, SRC, COMP, DST, FUNC)
 615 
 616 #define REGISTER_SCALEBLIT_FLAGS(SRC, COMP, DST, FUNC, SFLAGS, DFLAGS) \
 617     REGISTER_PRIMITIVE_FLAGS(ScaledBlit, SRC, COMP, DST, FUNC, SFLAGS, DFLAGS)
 618 
 619 #define REGISTER_BLITBG(SRC, COMP, DST, FUNC) \
 620     REGISTER_PRIMITIVE(BlitBg, SRC, COMP, DST, FUNC)
 621 
 622 #define REGISTER_FILLRECT(SRC, COMP, DST, FUNC) \
 623     REGISTER_PRIMITIVE(FillRect, SRC, COMP, DST, FUNC)
 624 
 625 #define REGISTER_FILLSPANS(SRC, COMP, DST, FUNC) \
 626     REGISTER_PRIMITIVE(FillSpans, SRC, COMP, DST, FUNC)
 627 
 628 #define REGISTER_FILLPGRAM(SRC, COMP, DST, FUNC) \
 629     REGISTER_PRIMITIVE(FillParallelogram, SRC, COMP, DST, FUNC), \
 630     REGISTER_PRIMITIVE(DrawParallelogram, SRC, COMP, DST, FUNC)
 631 
 632 #define REGISTER_LINE_PRIMITIVES(SRC, COMP, DST, FUNC) \
 633     REGISTER_PRIMITIVE(DrawLine, SRC, COMP, DST, FUNC), \
 634     REGISTER_PRIMITIVE(DrawRect, SRC, COMP, DST, FUNC), \
 635     REGISTER_PRIMITIVE(DrawPolygons, SRC, COMP, DST, FUNC), \
 636     REGISTER_PRIMITIVE(DrawPath, SRC, COMP, DST, FUNC), \
 637     REGISTER_PRIMITIVE(FillPath, SRC, COMP, DST, FUNC)
 638 
 639 #define REGISTER_MASKBLIT(SRC, COMP, DST, FUNC) \
 640     REGISTER_PRIMITIVE(MaskBlit, SRC, COMP, DST, FUNC)
 641 
 642 #define REGISTER_MASKFILL(SRC, COMP, DST, FUNC) \
 643     REGISTER_PRIMITIVE(MaskFill, SRC, COMP, DST, FUNC)
 644 
 645 #define REGISTER_DRAWGLYPHLIST(SRC, COMP, DST, FUNC) \
 646     REGISTER_PRIMITIVE(DrawGlyphList, SRC, COMP, DST, FUNC)
 647 
 648 #define REGISTER_DRAWGLYPHLISTAA(SRC, COMP, DST, FUNC) \
 649     REGISTER_PRIMITIVE(DrawGlyphListAA, SRC, COMP, DST, FUNC)
 650 
 651 #define REGISTER_DRAWGLYPHLISTLCD(SRC, COMP, DST, FUNC) \
 652     REGISTER_PRIMITIVE(DrawGlyphListLCD, SRC, COMP, DST, FUNC)
 653 
 654 #ifdef __cplusplus
 655 };
 656 #endif
 657 
 658 #endif /* GraphicsPrimitiveMgr_h_Included */