home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / utility / misc / toolmana.lha / ToolManager / Source / prefs / button.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-26  |  4.2 KB  |  135 lines

  1. /*
  2.  * button.c  V2.0
  3.  *
  4.  * requester image button code
  5.  *
  6.  * (c) 1990-1992 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Button image (static) */
  12. __chip static const UWORD FReqImageData[]={
  13.                                            0x03C0,
  14.                                            0x0420,
  15.                                            0xF810,
  16.                                            0xFC10,
  17.                                            0xC3F0,
  18.                                            0xC010,
  19.                                            0xC010,
  20.                                            0xC010,
  21.                                            0xC010,
  22.                                            0xFFF0
  23.                                           };
  24. static struct BitMap FReqImageBitMap={2,10,0,8,0,FReqImageData,FReqImageData,
  25.                                                  FReqImageData,FReqImageData,
  26.                                                  FReqImageData,FReqImageData,
  27.                                                  FReqImageData,FReqImageData};
  28.  
  29. /* Button image (dynamic) */
  30. static ULONG ChipDataSize;
  31. static struct BitMap BitMap;
  32. static struct Image ButtonImage1;
  33. static struct Image ButtonImage2;
  34.  
  35. /* Calculate requester button image */
  36. BOOL CalcReqButtonImage(void)
  37. {
  38.  struct DrawInfo *dri;
  39.  
  40.  if (dri=GetScreenDrawInfo(PublicScreen)) {
  41.   ULONG gheight=ScreenFont->tf_YSize+INTERHEIGHT+2;
  42.   ULONG gdepth=dri->dri_Depth;
  43.   UBYTE *chipdata;
  44.  
  45.   /* Calculate byte count for chip data (Image data are UWORDs!) */
  46.   ChipDataSize=(REQBUTTONWIDTH+15)/16*2*2*gheight*gdepth;
  47.  
  48.   /* Allocate memory for image */
  49.   if (chipdata=AllocMem(ChipDataSize,MEMF_PUBLIC|MEMF_CLEAR|MEMF_CHIP)) {
  50.    ULONG planemask=(1L << gdepth)-1;
  51.    ULONG yoff=(gheight-10)/2;
  52.  
  53.    /* Init Image structure */
  54.    ButtonImage1.LeftEdge=0;
  55.    ButtonImage1.TopEdge=0;
  56.    ButtonImage1.Width=REQBUTTONWIDTH;
  57.    ButtonImage1.Height=gheight;
  58.    ButtonImage1.Depth=gdepth;
  59.    ButtonImage1.PlanePick=planemask;
  60.    ButtonImage1.PlaneOnOff=0;
  61.    ButtonImage1.NextImage=NULL;
  62.    ButtonImage2=ButtonImage1;
  63.    ButtonImage1.ImageData=chipdata;
  64.    ButtonImage2.ImageData=chipdata+ChipDataSize/2;
  65.  
  66.    /* Init graphics structures */
  67.    InitBitMap(&BitMap,gdepth,REQBUTTONWIDTH,gheight);
  68.    InitRastPort(&TmpRastPort);
  69.    TmpRastPort.BitMap=&BitMap;
  70.  
  71.    /* Set plane pointers */
  72.    {
  73.     int i;
  74.     ULONG off=ChipDataSize/gdepth/2;
  75.     char *pl=ButtonImage1.ImageData;
  76.  
  77.     for (i=0; i<gdepth; i++, pl+=off) BitMap.Planes[i]=pl;
  78.    }
  79.  
  80.    /* Draw button image (deselected state) */
  81.    SetRast(&TmpRastPort,dri->dri_Pens[BACKGROUNDPEN]);
  82.    DrawBevelBox(&TmpRastPort,0,0,REQBUTTONWIDTH,gheight,GT_VisualInfo,ScreenVI,
  83.                                                         TAG_DONE);
  84.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ANBC,planemask,NULL);
  85.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ABC|ABNC|ANBC,
  86.              dri->dri_Pens[TEXTPEN],NULL);
  87.  
  88.    /* Set plane pointers */
  89.    {
  90.     int i;
  91.     ULONG off=ChipDataSize/gdepth/2;
  92.     char *pl=ButtonImage2.ImageData;
  93.  
  94.     for (i=0; i<gdepth; i++, pl+=off) BitMap.Planes[i]=pl;
  95.    }
  96.  
  97.    /* Draw button image (selected state) */
  98.    SetRast(&TmpRastPort,dri->dri_Pens[FILLPEN]);
  99.    DrawBevelBox(&TmpRastPort,0,0,REQBUTTONWIDTH,gheight,GT_VisualInfo,ScreenVI,
  100.                                                         GTBB_Recessed,FALSE,
  101.                                                         TAG_DONE);
  102.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ANBC,planemask,NULL);
  103.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ABC|ABNC|ANBC,
  104.              dri->dri_Pens[FILLTEXTPEN],NULL);
  105.  
  106.    /* All OK! */
  107.    FreeScreenDrawInfo(PublicScreen,dri);
  108.    return(TRUE);
  109.   }
  110.   FreeScreenDrawInfo(PublicScreen,dri);
  111.  }
  112.  return(FALSE);
  113. }
  114.  
  115. /* Free button images */
  116. void FreeReqButtonImage(void)
  117. {
  118.  FreeMem(ButtonImage1.ImageData,ChipDataSize);
  119. }
  120.  
  121. /* Init requester button */
  122. void InitReqButtonGadget(struct Gadget *g)
  123. {
  124.  struct IntuiText *it=g->GadgetText;
  125.  char *s=it->IText;
  126.  
  127.  g->Flags=GFLG_GADGHIMAGE|GFLG_GADGIMAGE;
  128.  g->Activation=GACT_RELVERIFY;
  129.  g->GadgetType|=GTYP_BOOLGADGET;
  130.  g->GadgetRender=&ButtonImage1;
  131.  g->SelectRender=&ButtonImage2;
  132.  it->LeftEdge=-TextLength(&TmpRastPort,s,strlen(s))-INTERWIDTH;
  133.  it->TopEdge=(INTERHEIGHT+2)/2;
  134. }
  135.