/*
 * GDI OEM bitmap objects
 *
 * Copyright 1994 Alexandre Julliard
 *
static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
*/
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef USE_XPM
#include <X11/xpm.h>
#endif
#include "gdi.h"
#include "bitmap.h"
#include "stddebug.h"
#include "color.h"
#include "debug.h"

#define OBM_FIRST  OBM_LFARROWI    /* First OEM bitmap */
#define OBM_LAST   OBM_OLD_CLOSE   /* Last OEM bitmap */

#ifdef USE_XPM


#define NB_COLOR_SYMBOLS  5

  /* This is the list of the symbolic colors. All the colors used */
  /* in the xpm files must be included in this list. If you need  */
  /* to add new colors, add them just before "black", and add the */
  /* color identifier in OBM_Sys_Colors_Symbols below.            */
  /* Warning: black and white must always be the last 2 colors.   */

static XpmColorSymbol OBM_Color_Symbols[NB_COLOR_SYMBOLS+2] =
{
    { "button_face", NULL, 0 },       /* COLOR_BTNFACE */
    { "button_shadow", NULL, 0 },     /* COLOR_BTNSHADOW */
    { "button_highlight", NULL, 0 },  /* COLOR_BTNHIGHLIGHT */
    { "button_text", NULL, 0 },       /* COLOR_BTNTEXT */
    { "window_frame", NULL, 0 },      /* COLOR_WINDOWFRAME */
    { "black", NULL, 0 },
    { "white", NULL, 0 }
};

static const int OBM_Sys_Colors_Symbols[NB_COLOR_SYMBOLS] =
{
    COLOR_BTNFACE,
    COLOR_BTNSHADOW,
    COLOR_BTNHIGHLIGHT,
    COLOR_BTNTEXT,
    COLOR_WINDOWFRAME
};

  /* Don't change this list! */
static XpmColorSymbol OBM_BW_Symbols[2] =
{
    { "white", NULL, 0 },
    { "black", NULL, 1 }
};


  /* Include OEM pixmaps */
#include "bitmaps/obm_lfarrowi"
#include "bitmaps/obm_rgarrowi"
#include "bitmaps/obm_dnarrowi"
#include "bitmaps/obm_uparrowi"
#include "bitmaps/obm_combo"
#include "bitmaps/obm_mnarrow"
#include "bitmaps/obm_lfarrowd"
#include "bitmaps/obm_rgarrowd"
#include "bitmaps/obm_dnarrowd"
#include "bitmaps/obm_uparrowd"
#include "bitmaps/obm_restored"
#include "bitmaps/obm_zoomd"
#include "bitmaps/obm_reduced"
#include "bitmaps/obm_restore"
#include "bitmaps/obm_zoom"
#include "bitmaps/obm_reduce"
#include "bitmaps/obm_lfarrow"
#include "bitmaps/obm_rgarrow"
#include "bitmaps/obm_dnarrow"
#include "bitmaps/obm_uparrow"
#include "bitmaps/obm_close"
#include "bitmaps/obm_old_restore"
#include "bitmaps/obm_old_zoom"
#include "bitmaps/obm_old_reduce"
#include "bitmaps/obm_btncorners"
#include "bitmaps/obm_checkboxes"
#include "bitmaps/obm_check"
#include "bitmaps/obm_btsize"
#include "bitmaps/obm_old_lfarrow"
#include "bitmaps/obm_old_rgarrow"
#include "bitmaps/obm_old_dnarrow"
#include "bitmaps/obm_old_uparrow"
#include "bitmaps/obm_size"
#include "bitmaps/obm_old_close"

static const struct
{
    char** data;   /* Pointer to bitmap data */
    BOOL   color;  /* Is it a color bitmap?  */
} OBM_Pixmaps_Data[OBM_LAST-OBM_FIRST+1] = {
    { obm_lfarrowi, TRUE },     /* OBM_LFARROWI */
    { obm_rgarrowi, TRUE },     /* OBM_RGARROWI */
    { obm_dnarrowi, TRUE },     /* OBM_DNARROWI */
    { obm_uparrowi, TRUE },     /* OBM_UPARROWI */
    { obm_combo, FALSE },       /* OBM_COMBO */
    { obm_mnarrow, FALSE },     /* OBM_MNARROW */
    { obm_lfarrowd, TRUE },     /* OBM_LFARROWD */
    { obm_rgarrowd, TRUE },     /* OBM_RGARROWD */
    { obm_dnarrowd, TRUE },     /* OBM_DNARROWD */
    { obm_uparrowd, TRUE },     /* OBM_UPARROWD */
    { obm_restored, TRUE },     /* OBM_RESTORED */
    { obm_zoomd, TRUE },        /* OBM_ZOOMD */
    { obm_reduced, TRUE },      /* OBM_REDUCED */
    { obm_restore, TRUE },      /* OBM_RESTORE */
    { obm_zoom, TRUE },         /* OBM_ZOOM */
    { obm_reduce, TRUE },       /* OBM_REDUCE */
    { obm_lfarrow, TRUE },      /* OBM_LFARROW */
    { obm_rgarrow, TRUE },      /* OBM_RGARROW */
    { obm_dnarrow, TRUE },      /* OBM_DNARROW */
    { obm_uparrow, TRUE },      /* OBM_UPARROW */
    { obm_close, TRUE },        /* OBM_CLOSE */
    { obm_old_restore, FALSE }, /* OBM_OLD_RESTORE */
    { obm_old_zoom, FALSE },    /* OBM_OLD_ZOOM */
    { obm_old_reduce, FALSE },  /* OBM_OLD_REDUCE */
    { obm_btncorners, FALSE },  /* OBM_BTNCORNERS */
    { obm_checkboxes, FALSE },  /* OBM_CHECKBOXES */
    { obm_check, FALSE },       /* OBM_CHECK */
    { obm_btsize, FALSE },      /* OBM_BTSIZE */
    { obm_old_lfarrow, FALSE }, /* OBM_OLD_LFARROW */
    { obm_old_rgarrow, FALSE }, /* OBM_OLD_RGARROW */
    { obm_old_dnarrow, FALSE }, /* OBM_OLD_DNARROW */
    { obm_old_uparrow, FALSE }, /* OBM_OLD_UPARROW */
    { obm_size, FALSE },        /* OBM_SIZE */
    { obm_old_close, FALSE },   /* OBM_OLD_CLOSE */
};

#else  /* USE_XPM */

  /* Include OEM bitmaps */
#include "bitmaps/check_boxes"
#include "bitmaps/check_mark"
#include "bitmaps/menu_arrow"

static const struct
{
    WORD width, height;
    char *data;
} OBM_Bitmaps_Data[OBM_LAST-OBM_FIRST+1] =
{
    { 0, 0, NULL },  /* OBM_LFARROWI */
    { 0, 0, NULL },  /* OBM_RGARROWI */
    { 0, 0, NULL },  /* OBM_DNARROWI */
    { 0, 0, NULL },  /* OBM_UPARROWI */
    { 0, 0, NULL },  /* OBM_COMBO */
    { menu_arrow_width, menu_arrow_height, menu_arrow_bits }, /* OBM_MNARROW */
    { 0, 0, NULL },  /* OBM_LFARROWD */
    { 0, 0, NULL },  /* OBM_RGARROWD */
    { 0, 0, NULL },  /* OBM_DNARROWD */
    { 0, 0, NULL },  /* OBM_UPARROWD */
    { 0, 0, NULL },  /* OBM_RESTORED */
    { 0, 0, NULL },  /* OBM_ZOOMD */
    { 0, 0, NULL },  /* OBM_REDUCED */
    { 0, 0, NULL },  /* OBM_RESTORE */
    { 0, 0, NULL },  /* OBM_ZOOM */
    { 0, 0, NULL },  /* OBM_REDUCE */
    { 0, 0, NULL },  /* OBM_LFARROW */
    { 0, 0, NULL },  /* OBM_RGARROW */
    { 0, 0, NULL },  /* OBM_DNARROW */
    { 0, 0, NULL },  /* OBM_UPARROW */
    { 0, 0, NULL },  /* OBM_CLOSE */
    { 0, 0, NULL },  /* OBM_OLD_RESTORE */
    { 0, 0, NULL },  /* OBM_OLD_ZOOM */
    { 0, 0, NULL },  /* OBM_OLD_REDUCE */
    { 0, 0, NULL },  /* OBM_BTNCORNERS */
    { check_boxes_width, check_boxes_height,
          check_boxes_bits },  /* OBM_CHECKBOXES */
    { check_mark_width, check_mark_height, check_mark_bits },  /* OBM_CHECK */
    { 0, 0, NULL },  /* OBM_BTSIZE */
    { 0, 0, NULL },  /* OBM_OLD_LFARROW */
    { 0, 0, NULL },  /* OBM_OLD_RGARROW */
    { 0, 0, NULL },  /* OBM_OLD_DNARROW */
    { 0, 0, NULL },  /* OBM_OLD_UPARROW */
    { 0, 0, NULL },  /* OBM_SIZE */
    { 0, 0, NULL },  /* OBM_OLD_CLOSE */
};

#endif /* USE_XPM */


/***********************************************************************
 *           OBM_InitColorSymbols
 */
#ifdef USE_XPM
static void OBM_InitColorSymbols()
{
    int i;
    static int already_done = 0;

    if (already_done) return;

      /* Init the system colors */
    for (i = 0; i < NB_COLOR_SYMBOLS; i++)
    {
        OBM_Color_Symbols[i].pixel = COLOR_ToPhysical( NULL,
                                       GetSysColor(OBM_Sys_Colors_Symbols[i]));
    }
      /* Init black and white */
    OBM_Color_Symbols[i++].pixel = COLOR_ToPhysical( NULL, RGB(0,0,0) );
    OBM_Color_Symbols[i++].pixel = COLOR_ToPhysical( NULL, RGB(255,255,255) );
    already_done = 1;
}
#endif  /* USE_XPM */

/***********************************************************************
 *           OBM_LoadOEMBitmap
 */
HBITMAP OBM_LoadOEMBitmap( WORD id )
{
    BITMAPOBJ * bmpObjPtr;
    HBITMAP hbitmap;
    WORD width, height, bpp;
    Pixmap pixmap;

    if ((id < OBM_FIRST) || (id > OBM_LAST)) return 0;
    id -= OBM_FIRST;

#ifdef USE_XPM
    if (!OBM_Pixmaps_Data[id].data) return 0;
    {
        XpmAttributes attrs;
        int err;

        OBM_InitColorSymbols();
        attrs.valuemask    = XpmColormap | XpmDepth | XpmColorSymbols;
        attrs.colormap     = COLOR_WinColormap;
        if (OBM_Pixmaps_Data[id].color) attrs.depth = bpp = screenDepth;
        else attrs.depth = bpp = 1;
        attrs.colorsymbols = (bpp > 1) ? OBM_Color_Symbols : OBM_BW_Symbols;
        attrs.numsymbols   = (bpp > 1) ? NB_COLOR_SYMBOLS + 2 : 2;
        
        if ((err = XpmCreatePixmapFromData( display, rootWindow,
                                            OBM_Pixmaps_Data[id].data,
                                            &pixmap, NULL,
                                            &attrs )) != XpmSuccess)
        {
            fprintf( stderr, "Error %d creating pixmap %d\n",
                     err, OBM_FIRST+id );
            pixmap = 0;
        }
        else
        {
            width = attrs.width;
            height = attrs.height;
        }
    }
#else
    if (!OBM_Bitmaps_Data[id].data) return 0;
    bpp = 1;
    width  = OBM_Bitmaps_Data[id].width;
    height = OBM_Bitmaps_Data[id].height;
    pixmap = XCreateBitmapFromData( display, rootWindow, 
                                    OBM_Bitmaps_Data[id].data, width, height );
#endif  /* USE_XPM */

    if (!pixmap) return 0;

      /* Create the BITMAPOBJ */
    if (!(hbitmap = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC )))
    {
        XFreePixmap( display, pixmap );
	return 0;
    }
    bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_ADDR( hbitmap );
    bmpObjPtr->size.cx = 0;
    bmpObjPtr->size.cy = 0;
    bmpObjPtr->pixmap  = pixmap;
    bmpObjPtr->bitmap.bmType       = 0;
    bmpObjPtr->bitmap.bmWidth      = width;
    bmpObjPtr->bitmap.bmHeight     = height;
    bmpObjPtr->bitmap.bmWidthBytes = (width + 15) / 16 * 2;
    bmpObjPtr->bitmap.bmPlanes     = 1;
    bmpObjPtr->bitmap.bmBitsPixel  = bpp;
    bmpObjPtr->bitmap.bmBits       = NULL;
    return hbitmap;
}


