/*
 * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

#ifndef ByteIndexed_h_Included
#define ByteIndexed_h_Included

#include "IntDcm.h"

/*
 * This file contains macro and type definitions used by the macros in
 * LoopMacros.h to manipulate a surface of type "ByteIndexed".
 */

typedef jubyte  ByteIndexedPixelType;
typedef jubyte  ByteIndexedDataType;

#define ByteIndexedPixelStride          1
#define ByteIndexedBitsPerPixel         8

#define DeclareByteIndexedLoadVars(PREFIX) \
    jint *PREFIX ## Lut;

#define DeclareByteIndexedStoreVars(PREFIX) \
    int PREFIX ## XDither, PREFIX ## YDither; \
    char *PREFIX ## rerr, *PREFIX ## gerr, *PREFIX ## berr; \
    unsigned char *PREFIX ## InvLut;

#define SetByteIndexedStoreVarsYPos(PREFIX, pRasInfo, LOC) \
    do { \
         PREFIX ## YDither = ((LOC & 7) << 3); \
    } while (0)

#define SetByteIndexedStoreVarsXPos(PREFIX, pRasInfo, LOC) \
    do { \
        PREFIX ## rerr = (pRasInfo)->redErrTable + PREFIX ## YDither; \
        PREFIX ## gerr = (pRasInfo)->grnErrTable + PREFIX ## YDither; \
        PREFIX ## berr = (pRasInfo)->bluErrTable + PREFIX ## YDither; \
        PREFIX ## XDither = (LOC & 7); \
    } while (0)

#define InitByteIndexedLoadVars(PREFIX, pRasInfo) \
    PREFIX ## Lut = (pRasInfo)->lutBase

/* REMIND Could collapse Init..Store..X and Init..Store..Y into one Init
 * and factor out the Set.. macros.
 */
#define InitByteIndexedStoreVarsY(PREFIX, pRasInfo) \
    do { \
        SetByteIndexedStoreVarsYPos(PREFIX, pRasInfo, (pRasInfo)->bounds.y1); \
        PREFIX ## InvLut = (pRasInfo)->invColorTable; \
    } while (0)

#define InitByteIndexedStoreVarsX(PREFIX, pRasInfo) \
    SetByteIndexedStoreVarsXPos(PREFIX, pRasInfo, (pRasInfo)->bounds.x1);


#define NextByteIndexedStoreVarsX(PREFIX) \
    PREFIX ## XDither = (PREFIX ## XDither + 1) & 7

#define NextByteIndexedStoreVarsY(PREFIX) \
    PREFIX ## YDither = (PREFIX ## YDither + (1 << 3)) & (7 << 3)

typedef jubyte  ByteIndexedBmPixelType;
typedef jubyte  ByteIndexedBmDataType;

#define ByteIndexedBmPixelStride        1
#define ByteIndexedBmBitsPerPixel       8

#define DeclareByteIndexedBmLoadVars    DeclareByteIndexedLoadVars
#define DeclareByteIndexedBmStoreVars   DeclareByteIndexedStoreVars
#define InitByteIndexedBmLoadVars       InitByteIndexedLoadVars
#define InitByteIndexedBmStoreVarsY     InitByteIndexedStoreVarsY
#define InitByteIndexedBmStoreVarsX     InitByteIndexedStoreVarsX
#define NextByteIndexedBmStoreVarsX     NextByteIndexedStoreVarsX
#define NextByteIndexedBmStoreVarsY     NextByteIndexedStoreVarsY

#define LoadByteIndexedBmTo1IntArgb     LoadByteIndexedTo1IntArgb

#define CopyByteIndexedBmToIntArgbPre(pRGB, i, PREFIX, pRow, x) \
    do { \
        jint argb = PREFIX ## Lut[pRow[x]]; \
        (pRGB)[i] = argb & (argb >> 24); \
    } while (0)


#define ByteIndexedXparLutEntry                 -1
#define ByteIndexedIsXparLutEntry(pix)          (pix < 0)
#define StoreByteIndexedNonXparFromArgb         StoreByteIndexedFrom1IntArgb

#define StoreByteIndexedPixel(pRas, x, pixel) \
    ((pRas)[x] = (jubyte) (pixel))

#define DeclareByteIndexedPixelData(PREFIX)
#define ExtractByteIndexedPixelData(PIXEL, PREFIX)

#define StoreByteIndexedPixelData(pPix, x, pixel, PREFIX) \
    (pPix)[x] = (jubyte) (pixel)

#define ByteIndexedPixelFromArgb(pixel, rgb, pRasInfo) \
    do { \
        jint r, g, b; \
        ExtractIntDcmComponentsX123(rgb, r, g, b); \
        (pixel) = SurfaceData_InvColorMap((pRasInfo)->invColorTable, \
                                          r, g, b); \
    } while (0)

#define LoadByteIndexedTo1IntRgb(pRas, PREFIX, x, rgb) \
    (rgb) = PREFIX ## Lut[pRas[x]]

#define LoadByteIndexedTo1IntArgb(pRas, PREFIX, x, argb) \
    (argb) = PREFIX ## Lut[pRas[x]]

#define LoadByteIndexedTo3ByteRgb(pRas, PREFIX, x, r, g, b) \
    do { \
        jint rgb = PREFIX ## Lut[pRas[x]]; \
        ExtractIntDcmComponentsX123(rgb, r, g, b); \
    } while (0)

#define LoadByteIndexedTo4ByteArgb(pRas, PREFIX, x, a, r, g, b) \
    do { \
        jint argb = PREFIX ## Lut[pRas[x]]; \
        ExtractIntDcmComponents1234(argb, a, r, g, b); \
    } while (0)

#define ByteClamp1Component(X)  \
    do { if (((X) >> 8) != 0) {X = (~(X >> 31)) & 255; } } while (0)

#define ByteClamp3Components(R, G, B) \
    do { \
        if (((R|G|B) >> 8) != 0) { \
            ByteClamp1Component(R); \
            ByteClamp1Component(G); \
            ByteClamp1Component(B); \
        } \
    } while (0)

#define StoreByteIndexedFrom1IntRgb(pRas, PREFIX, x, rgb) \
    do { \
        int r, g, b; \
        ExtractIntDcmComponentsX123(rgb, r, g, b); \
        StoreByteIndexedFrom3ByteRgb(pRas, PREFIX, x, r, g, b); \
    } while (0)

#define StoreByteIndexedFrom1IntArgb(pRas, PREFIX, x, argb) \
    StoreByteIndexedFrom1IntRgb(pRas, PREFIX, x, argb)

#define StoreByteIndexedFrom3ByteRgb(pRas, PREFIX, x, r, g, b) \
    do { \
        r += PREFIX ## rerr[PREFIX ## XDither]; \
        g += PREFIX ## gerr[PREFIX ## XDither]; \
        b += PREFIX ## berr[PREFIX ## XDither]; \
        ByteClamp3Components(r, g, b); \
        (pRas)[x] = SurfaceData_InvColorMap(PREFIX ## InvLut, r, g, b); \
    } while (0)

#define StoreByteIndexedFrom4ByteArgb(pRas, PREFIX, x, a, r, g, b) \
    StoreByteIndexedFrom3ByteRgb(pRas, PREFIX, x, r, g, b)

#define CopyByteIndexedToIntArgbPre(pRGB, i, PREFIX, pRow, x) \
    do { \
        jint argb = PREFIX ## Lut[pRow[x]]; \
        jint a = URShift(argb, 24); \
        if (a == 0) { \
            argb = 0; \
        } else if (a < 0xff) { \
            jint r = (argb >> 16) & 0xff; \
            jint g = (argb >>  8) & 0xff; \
            jint b = (argb      ) & 0xff; \
            r = MUL8(a, r); \
            g = MUL8(a, g); \
            b = MUL8(a, b); \
            argb = ComposeIntDcmComponents1234(a, r, g, b); \
        } \
        (pRGB)[i] = argb; \
    } while (0)


#define DeclareByteIndexedAlphaLoadData(PREFIX) \
    jint *PREFIX ## Lut; \
    jint PREFIX ## rgb;

#define InitByteIndexedAlphaLoadData(PREFIX, pRasInfo) \
    PREFIX ## Lut = (pRasInfo)->lutBase

#define LoadAlphaFromByteIndexedFor4ByteArgb(pRas, PREFIX, COMP_PREFIX) \
    do { \
        PREFIX ## rgb = PREFIX ## Lut[(pRas)[0]]; \
        COMP_PREFIX ## A = ((juint) PREFIX ## rgb) >> 24; \
    } while (0)

#define Postload4ByteArgbFromByteIndexed(pRas, PREFIX, COMP_PREFIX) \
    do { \
        COMP_PREFIX ## R = (PREFIX ## rgb >> 16) & 0xff; \
        COMP_PREFIX ## G = (PREFIX ## rgb >>  8) & 0xff; \
        COMP_PREFIX ## B = (PREFIX ## rgb >>  0) & 0xff; \
    } while (0)


#define ByteIndexedIsPremultiplied      0

#define StoreByteIndexedFrom4ByteArgbComps(pRas, PREFIX, x, COMP_PREFIX) \
    StoreByteIndexedFrom4ByteArgb(pRas, PREFIX, x, \
                                  COMP_PREFIX ## A, COMP_PREFIX ## R, \
                                  COMP_PREFIX ## G, COMP_PREFIX ## B)

#endif /* ByteIndexed_h_Included */
