1/*
2 * Copyright (c) 1996, 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/*
27 * This file contains macro definitions for the Decoding category of
28 * the macros used by the generic scaleloop function.
29 *
30 * This implementation can decode the pixel information associated
31 * with any valid Java ColorModel object by dynamically invoking the
32 * getRGB method on that object.  The implementation will also
33 * optimally handle pixel data coming from IndexColorModel and
34 * DirectColorModel objects so that it can be used as the default
35 * fallback implementation for corner cases without imposing the
36 * enormous performance penalty required for handling the custom
37 * ColorModel objects in those cases.
38 *
39 * This file can be used to provide the default implementation of the
40 * Decoding macros, handling all color conversion cases.
41 */
42
43/*
44 * These definitions vector the standard macro names to the "Any"
45 * versions of those macros.  The "DecodeDeclared" keyword is also
46 * defined to indicate to the other include files that they are not
47 * defining the primary implementation.  All other include files
48 * will check for the existance of the "DecodeDeclared" keyword
49 * and define their implementations of the Decoding macros using
50 * more specific names without overriding the standard names.
51 * This is done so that the other files can be included here to
52 * reuse their implementations for the specific optimization cases.
53 */
54#define DecodeDeclared
55#define DeclareDecodeVars       DeclareAnyVars
56#define InitPixelDecode         InitPixelAny
57#define PixelDecode             PixelAnyDecode
58
59/* Include the optimal implementations for Index and Direct ColorModels */
60#include "img_icm.h"
61#include "img_dcm.h"
62
63#define ICMTYPE         0
64#define DCMTYPE         1
65#define OCMTYPE         2
66
67#define DeclareAnyVars                                          \
68    DeclareICMVars                                              \
69    DeclareDCMVars                                              \
70    struct execenv *ee;                                         \
71    struct methodblock *mb = 0;                                 \
72    int CMtype;
73
74#define InitPixelAny(CM)                                                \
75    do {                                                                \
76        Classjava_awt_image_ColorModel *cm =                            \
77            (Classjava_awt_image_ColorModel *) unhand(CM);              \
78        ImgCMData *icmd = (ImgCMData *) cm->pData;                      \
79        if ((icmd->type & IMGCV_CMBITS) == IMGCV_ICM) {                 \
80            CMtype = ICMTYPE;                                           \
81            InitPixelICM(cm);                                           \
82        } else if (((icmd->type & IMGCV_CMBITS) == IMGCV_DCM)           \
83                   || ((icmd->type & IMGCV_CMBITS) == IMGCV_DCM8)) {    \
84            CMtype = DCMTYPE;                                           \
85            InitPixelDCM(cm);                                           \
86        } else {                                                        \
87            CMtype = OCMTYPE;                                           \
88            ee = EE();                                                  \
89            mb = icmd->mb;                                              \
90        }                                                               \
91    } while (0)
92
93#define PixelAnyDecode(CM, pixel, red, green, blue, alpha)              \
94    do {                                                                \
95        switch (CMtype) {                                               \
96        case ICMTYPE:                                                   \
97            PixelICMDecode(CM, pixel, red, green, blue, alpha);         \
98            break;                                                      \
99        case DCMTYPE:                                                   \
100            PixelDCMDecode(CM, pixel, red, green, blue, alpha);         \
101            break;                                                      \
102        case OCMTYPE:                                                   \
103            pixel = do_execute_java_method(ee, (void *) CM,             \
104                                           "getRGB","(I)I", mb,         \
105                                           FALSE, pixel);               \
106            if (exceptionOccurred(ee)) {                                \
107                return SCALEFAILURE;                                    \
108            }                                                           \
109            IfAlpha(alpha = pixel >> ALPHASHIFT;)                       \
110            red = (pixel >> REDSHIFT) & 0xff;                           \
111            green = (pixel >> GREENSHIFT) & 0xff;                       \
112            blue = (pixel >> BLUESHIFT) & 0xff;                         \
113            break;                                                      \
114        }                                                               \
115    } while (0)
116