home *** CD-ROM | disk | FTP | other *** search
- //#ifndef AMIGAMESApal_H
- //#define AMIGAMESApal_H
-
- /*
- * $Id: $
- */
-
- /*
- * Mesa 3-D graphics library
- * Version: 3.1
- * Copyright (C) 1995 Brian Paul (brianp@ssec.wisc.edu)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- #ifdef PALETTE_DEFS
- /* first part defines amigaMesa-specifig tag
- * second part defines the choosen palette (aka modelling of available colors)
- * third part defines methog to fetch data (aka encoding of given colors
- *
- * at the moment dithering is only available in RGBMode, that means if we are
- * in index-mode the index-pixels are directly (without dither) mapped to
- * pen-pixels, it could be an improvement to offer dithering even for index-modes
- */
- typedef enum PaletteModeID {
- /* dithering */
- AMESA_HPCR_DITHER = -8, /* hp-color-recovery */
- AMESA_GREY_DITHER = -4,
- AMESA_WEIGHTED_DITHER = -2, /* default standard 0 */
- AMESA_TRUECOLOR_DITHER = -1, /* matches below 0 */
- /* matching */
- AMESA_HPCR_MATCH = 8, /* hp-color-recovery */
- AMESA_GREY_MATCH = 4,
- AMESA_WEIGHTED_MATCH = 2, /* default standard 0 */
- AMESA_TRUECOLOR_MATCH = 1, /* matches below 0 */
- /* shifting */
- AMESA_TRUECOLOR_SHIFT = 0, /* shifts above 0 */
- /* invalid */
- AMESA_DEADFOOD = 0xDEAD /* dead man */
- } palMode;
-
- #define MATCHtoDITHER(bool) ((bool) = -(bool)) /* if in shift-mode dither isn't available */
- #define DITHERtoMATCH(bool) ((bool) = -(bool)) /* if in shift-mode dither isn't available */
-
- #define IS_HPCR(bool) (((bool) == 8) || ((bool) == -8))
- #define IS_GREY(bool) (((bool) == 4) || ((bool) == -4))
- #define IS_WEIGHTED(bool) (((bool) == 2) || ((bool) == -2))
- #define IS_TRUECOLOR(bool) (((bool) >= -1) && ((bool) <= 1))
-
- #define IS_DITHER(bool) ((bool) < 0)
- #define IS_MATCH(bool) ((bool) > 0)
- #define IS_SHIFT(bool) ((bool) == 0)
-
- /*****************************************************************************
- *
- * fetch-macros
- */
-
- /* compositions */
- #define c8toc32(x) (((((((x) << 8) | (x)) << 8) | (x)) << 8) | (x)) /* byte-pen to pattern-pen */
- #define c24tocg(r,g,b) (((r << 5) + (g << 6) + (g << 5) + (b << 3) + b) >> 9) /* rgb-color to 64-grey (quick approximation) */
- #define c24toc8(r,g,b) ((((r) & 0xE0) >> 0) | \
- (((g) & 0xE0) >> 3) | \
- (((b) & 0xE0) >> 6)) /* rgb-color to 332-color */
-
- /* TrueColor-RGB */
- #define TC_RGBA(r,g,b) (((((((r) << 8) | (g)) << 8) | (b)) << 8) | (0)) /* byte-rgb to long-rgba */
- #define TC_ARGB(r,g,b) (((((((0) << 8) | (r)) << 8) | (g)) << 8) | (b)) /* byte-rgb to long-argb */
- #define TC_Color(col,rr,gg,bb,aa) {col.r = (W3D_Float)rr; \
- col.g = (W3D_Float)gg; \
- col.b = (W3D_Float)bb; \
- col.a = (W3D_Float)aa;} /* rgba to float-rgba */
-
- /* Grey-RGB */
- #define GR_RGBA(am, r, g, b) (am->Palette[c24tocg(r, g, b)].PenNo) /* rgb-color to grey-pen */
-
- /* Palette-Index */
- #define PLD_RGBA(am, r, g, b, x, y) (GetPenDithered(r, g, b, am, x, y)) /* rgb-color to dithered-pen */
- #define PLG_RGBA(am, r, g, b) (GetPen(r, g, b, am)) /* rgb-color to pen */
- #define PL8_RGBA(am, r, g, b) (am->Palette[c24toc8(r, g, b)].PenNo) /* rgb-color to 332-pen */
-
- /* the format of index is RGBI, red|green|blue|index */
- #define MakeRGBP(am, r, g, b, x, y) (TC_RGBA(r, g, b) | PL_RGBA(am, r, g, b, x, y)) /* rgb to long-rgbp */
- #define MakeRGBA(am, r, g, b, a) (TC_RGBA(r, g, b) | a) /* rgb to long-rgba */
- /* get the red/green/blue/pen from a given index */
- #define GetRGBP(am, idx) (am->ItoP[(GLubyte)(idx)]) /* index to pen */
- #define GetRGBPLocal(idx) (ItoP[(GLubyte)(idx)]) /* index to pen */
- /* get the red/green/blue/index from a given pen */
- #define GetIndex(am, idx) (am->PtoI[(GLubyte)(idx)]) /* pen to index */
- #define GetIndexLocal(idx) (PtoI[(GLubyte)(idx)]) /* pen to index */
-
- /*****************************************************************************/
-
- struct ColorEntry {
- struct {
- unsigned char r, g, b, a;
- } orgEntry;
- struct {
- unsigned char r, g, b, a;
- } mapEntry;
- /*ULONG PenNo; */
- #define PenNo mapEntry.a
- };
-
- #define CACHED 0xFF
- #define INVALID 0x00
- struct ColorCache {
- unsigned char PenCch, R, B, valid;
- };
-
- #define palNumCols332 256
- #define palNumCols 189
- #define palNumColsGrey 64
- #define palNumColsHPCR 256
-
- #define palNumColsMax 256
-
- #define ERROR_RANGE 512 /* -255 = 0 - 255, 255 = 255 - 0: -255 -> 255 */
- #endif
-
- /*****************************************************************************/
-
- #ifdef PALETTE_PROTOS
- ULONG GetPen(register unsigned char R __asm__("d0"),
- register unsigned char G __asm__("d1"),
- register unsigned char B __asm__("d2"),
- register amigaMesaContext amesa __asm__("a0"));
- ULONG GetPenDithered(register unsigned char R __asm__("d0"),
- register unsigned char G __asm__("d1"),
- register unsigned char B __asm__("d2"),
- register amigaMesaContext amesa __asm__("a0"),
- register unsigned char X __asm__("d3"), /* as the ditherkernel doesn't exceed 2^8 */
- register unsigned char Y __asm__("d4")); /* we can safe shrink the ccordinates to it */
- void AllocCMap(amigaMesaContext, struct Screen *);
- void FreeCMap(amigaMesaContext, struct Screen *);
- void RethinkCMap(amigaMesaContext);
- void ConvertCMap(amigaMesaContext, palMode, struct Screen *Scr);
-
- static inline GLuint PL_RGBA(amigaMesaContext am, GLubyte r, GLubyte g, GLubyte b, GLushort x, GLushort y) {
- return IS_SHIFT(am->trueColor) ? PL8_RGBA(am, r, g, b) :
- IS_MATCH(am->trueColor) ? PLG_RGBA(am, r, g, b) :
- PLD_RGBA(am, r, g, b, x, y);
- };
- #endif
-
- //#endif
-