1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/************************************************************************/
/* */
/* Retrieve images. */
/* */
/************************************************************************/
# include "appFrameConfig.h"
# include "appFrame.h"
# include "appIcons.h"
# include <appDebugon.h>
# ifdef USE_MOTIF
# include <X11/xpm.h>
static XpmAttributes APP_XpmAttributes;
/************************************************************************/
/* */
/* Get a pixmap. Keep trying with more and more tolerance for the */
/* exactness of the colors. */
/* */
/************************************************************************/
int appGetImagePixmap( EditApplication * ea,
const char * name,
APP_BITMAP_IMAGE * pPixmap,
APP_BITMAP_MASK * pMask )
{
int i;
int res;
NamedPicture * np;
Display * display= XtDisplay( ea->eaToplevel.atTopWidget );
Pixmap pixmap= (Pixmap)0;
Pixmap mask= (Pixmap)0;
if ( ! APP_XpmAttributes.valuemask )
{
APP_XpmAttributes.valuemask= XpmRGBCloseness;
APP_XpmAttributes.red_closeness= 8;
APP_XpmAttributes.green_closeness= 8;
APP_XpmAttributes.blue_closeness= 16;
}
np= ea->eaNamedPictures;
for ( i= 0; i < ea->eaNamedPictureCount; np++, i++ )
{
if ( ! strcmp( name, np->npPictureName ) )
{ break; }
}
if ( i >= ea->eaNamedPictureCount )
{ SLDEB(name,ea->eaNamedPictureCount); return -1; }
if ( np->npPixmap )
{ *pPixmap= np->npPixmap; *pMask= mask; return 0; }
res= XpmCreatePixmapFromData( display,
RootWindow( display, DefaultScreen( display ) ),
np->npBuffer, &pixmap, &mask,
&APP_XpmAttributes );
while( res == XpmColorFailed && APP_XpmAttributes.red_closeness < 10000 )
{
APP_XpmAttributes.red_closeness *= 2;
APP_XpmAttributes.green_closeness *= 2;
APP_XpmAttributes.blue_closeness *= 2;
res= XpmCreatePixmapFromData( display,
RootWindow( display, DefaultScreen( display ) ),
np->npBuffer, &pixmap, &mask,
&APP_XpmAttributes );
}
if ( res )
{ SLDEB(name,res); return -1; }
np->npPixmap= pixmap;
np->npMask= mask;
*pPixmap= pixmap; *pMask= mask; return 0;
}
void appDiscardImagePixmaps( EditApplication * ea )
{
int i;
NamedPicture * np;
Display * display= XtDisplay( ea->eaToplevel.atTopWidget );
np= ea->eaNamedPictures;
for ( i= 0; i < ea->eaNamedPictureCount; np++, i++ )
{
if ( np->npPixmap )
{ XFreePixmap( display, np->npPixmap ); np->npPixmap= None; }
if ( np->npMask )
{ XFreePixmap( display, np->npMask ); np->npMask= None; }
}
return;
}
# endif
|