| 1 | /* | 
|---|
| 2 | * Copyright (c) 2005, 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 SPLASHSCREEN_GFX_H | 
|---|
| 27 | #define SPLASHSCREEN_GFX_H | 
|---|
| 28 |  | 
|---|
| 29 | /*  splashscreen_gfx is a general purpose code for converting pixmaps between various visuals | 
|---|
| 30 | it is not very effective, but is universal and concise */ | 
|---|
| 31 |  | 
|---|
| 32 | #include "splashscreen_config.h" | 
|---|
| 33 |  | 
|---|
| 34 | enum | 
|---|
| 35 | { | 
|---|
| 36 | BYTE_ORDER_LSBFIRST = 0,    // least significant byte first | 
|---|
| 37 | BYTE_ORDER_MSBFIRST = 1,    // most significant byte first | 
|---|
| 38 | BYTE_ORDER_NATIVE = 2       // exactly the same as the arch we're running this on | 
|---|
| 39 | // will behave identical to _LSBFIRST or _MSBFIRST, | 
|---|
| 40 | // but more effective | 
|---|
| 41 | }; | 
|---|
| 42 |  | 
|---|
| 43 | enum | 
|---|
| 44 | { | 
|---|
| 45 | DITHER_SIZE = 16, | 
|---|
| 46 | DITHER_MASK = 15 | 
|---|
| 47 | }; | 
|---|
| 48 |  | 
|---|
| 49 | typedef struct DitherSettings | 
|---|
| 50 | { | 
|---|
| 51 | int numColors; | 
|---|
| 52 | rgbquad_t colorTable[512]; | 
|---|
| 53 | unsigned matrix[DITHER_SIZE][DITHER_SIZE]; | 
|---|
| 54 | } DitherSettings; | 
|---|
| 55 |  | 
|---|
| 56 | /* this structure is similar to Xlib's Visual */ | 
|---|
| 57 |  | 
|---|
| 58 | typedef struct ImageFormat | 
|---|
| 59 | { | 
|---|
| 60 | rgbquad_t mask[4]; | 
|---|
| 61 | int shift[4]; | 
|---|
| 62 | int depthBytes;             // 1,2,3 or 4. 3 is not supported for XCVT_BYTE_ORDER_NATIVE. | 
|---|
| 63 | int byteOrder;              // see BYTE_ORDER_LSBFIRST, BYTE_ORDER_MSBFIRST or BYTE_ORDER_NATIVE | 
|---|
| 64 | int fixedBits;              // this value is or'ed with the color value on get or put, non-indexed only | 
|---|
| 65 | // for indexed color, may be used when pre-decoding the colormap | 
|---|
| 66 | rgbquad_t *colorMap;        // colormap should be pre-decoded (i.e. an array of rgbquads) | 
|---|
| 67 | // when colormap is non-NULL, the source color is an index to a colormap, and | 
|---|
| 68 | // masks/shifts are unused. | 
|---|
| 69 | unsigned transparentColor;  // only for indexed colors. this is transparent color _INDEX_. | 
|---|
| 70 | // use a more-than-max value when you don't need transparency. | 
|---|
| 71 | int premultiplied; | 
|---|
| 72 | DitherSettings *dithers; | 
|---|
| 73 | int numColors;              // in the colormap, only for indexed color | 
|---|
| 74 | rgbquad_t *colorIndex;      // color remapping index for dithering mode | 
|---|
| 75 | } ImageFormat; | 
|---|
| 76 |  | 
|---|
| 77 | /* this structure defines a rectangular portion of an image buffer. height and/or width may be inverted. */ | 
|---|
| 78 |  | 
|---|
| 79 | typedef struct ImageRect | 
|---|
| 80 | { | 
|---|
| 81 | int numLines;               // number of scanlines in the rectangle | 
|---|
| 82 | int numSamples;             // number of samples in the line | 
|---|
| 83 | int stride;                 // distance between first samples of n'th and n+1'th scanlines, in bytes | 
|---|
| 84 | int depthBytes;             // distance between n'th and n+1'th sample in a scanline, in bytes | 
|---|
| 85 | void *pBits;                // points to sample 0, scanline 0 | 
|---|
| 86 | ImageFormat *format;        // format of the samples | 
|---|
| 87 | int row, col, jump;         // dithering indexes | 
|---|
| 88 | } ImageRect; | 
|---|
| 89 |  | 
|---|
| 90 | enum | 
|---|
| 91 | { | 
|---|
| 92 | CVT_COPY, | 
|---|
| 93 | CVT_ALPHATEST, | 
|---|
| 94 | CVT_BLEND | 
|---|
| 95 | }; | 
|---|
| 96 |  | 
|---|
| 97 | #define  MAX_COLOR_VALUE    255 | 
|---|
| 98 | #define  QUAD_ALPHA_MASK    0xFF000000 | 
|---|
| 99 | #define  QUAD_RED_MASK      0x00FF0000 | 
|---|
| 100 | #define  QUAD_GREEN_MASK    0x0000FF00 | 
|---|
| 101 | #define  QUAD_BLUE_MASK     0x000000FF | 
|---|
| 102 |  | 
|---|
| 103 | #define  QUAD_ALPHA_SHIFT   24 | 
|---|
| 104 | #define  QUAD_RED_SHIFT     16 | 
|---|
| 105 | #define  QUAD_GREEN_SHIFT   8 | 
|---|
| 106 | #define  QUAD_BLUE_SHIFT    0 | 
|---|
| 107 |  | 
|---|
| 108 | #define QUAD_ALPHA(value) (((value)&QUAD_ALPHA_MASK)>>QUAD_ALPHA_SHIFT) | 
|---|
| 109 | #define QUAD_RED(value) (((value)&QUAD_RED_MASK)>>QUAD_RED_SHIFT) | 
|---|
| 110 | #define QUAD_GREEN(value) (((value)&QUAD_GREEN_MASK)>>QUAD_GREEN_SHIFT) | 
|---|
| 111 | #define QUAD_BLUE(value) (((value)&QUAD_BLUE_MASK)>>QUAD_BLUE_SHIFT) | 
|---|
| 112 |  | 
|---|
| 113 | #define MAKE_QUAD(r,g,b,a) \ | 
|---|
| 114 | (((a)<<QUAD_ALPHA_SHIFT)&QUAD_ALPHA_MASK)| \ | 
|---|
| 115 | (((r)<<QUAD_RED_SHIFT)&QUAD_RED_MASK)| \ | 
|---|
| 116 | (((g)<<QUAD_GREEN_SHIFT)&QUAD_GREEN_MASK)| \ | 
|---|
| 117 | (((b)<<QUAD_BLUE_SHIFT)&QUAD_BLUE_MASK) \ | 
|---|
| 118 |  | 
|---|
| 119 |  | 
|---|
| 120 | /* alpha testing threshold. what's >= the threshold is considered non-transparent when doing | 
|---|
| 121 | conversion operation with CVT_ALPHATEST and when generating shapes/regions with | 
|---|
| 122 | BitmapToYXBandedRectangles */ | 
|---|
| 123 |  | 
|---|
| 124 | #define ALPHA_THRESHOLD     0x80000000 | 
|---|
| 125 |  | 
|---|
| 126 | void initRect(ImageRect * pRect, int x, int y, int width, int height, int jump, | 
|---|
| 127 | int stride, void *pBits, ImageFormat * format); | 
|---|
| 128 | int convertRect2(ImageRect * pSrcRect, ImageRect * pDstRect, int mode, | 
|---|
| 129 | ImageRect * pSrcRect2); | 
|---|
| 130 | int convertRect(ImageRect * pSrcRect, ImageRect * pDstRect, int mode); | 
|---|
| 131 | void convertLine(void *pSrc, int incSrc, void *pDst, int incDst, int n, | 
|---|
| 132 | ImageFormat * srcFormat, ImageFormat * dstFormat, int mode, | 
|---|
| 133 | void *pSrc2, int incSrc2, ImageFormat * srcFormat2, int row, int col); | 
|---|
| 134 | void initFormat(ImageFormat * format, int redMask, int greenMask, | 
|---|
| 135 | int blueMask, int alphaMask); | 
|---|
| 136 | int fillRect(rgbquad_t color, ImageRect * pDstRect); | 
|---|
| 137 | void dumpFormat(ImageFormat * format); | 
|---|
| 138 |  | 
|---|
| 139 | void optimizeFormat(ImageFormat * format); | 
|---|
| 140 |  | 
|---|
| 141 | void initDither(DitherSettings * pDither, int numColors, int scale); | 
|---|
| 142 |  | 
|---|
| 143 | int quantizeColors(int maxNumColors, int *numColors); | 
|---|
| 144 |  | 
|---|
| 145 | void initColorCube(int *numColors, rgbquad_t * pColorMap, | 
|---|
| 146 | DitherSettings * pDithers, rgbquad_t * colorIndex); | 
|---|
| 147 | int platformByteOrder(); | 
|---|
| 148 |  | 
|---|
| 149 | #endif | 
|---|
| 150 |  | 
|---|