home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / term-Source.lha / termAbout.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-07  |  11.9 KB  |  576 lines

  1. /*
  2. **    termAbout.c
  3. **
  4. **    Support routines for the `About' window.
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_FRAME=1,GAD_BUTTON };
  13.  
  14.     /* LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height):
  15.      *
  16.      *    Delete yet another screen bitmap.
  17.      */
  18.  
  19. STATIC VOID __regargs
  20. LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height)
  21. {
  22.     if(BitMap)
  23.     {
  24.         WORD i;
  25.  
  26.         WaitBlit();
  27.  
  28.         for(i = 0 ; i < BitMap -> Depth ; i++)
  29.         {
  30.             if(BitMap -> Planes[i])
  31.                 FreeRaster(BitMap -> Planes[i],Width,Height);
  32.         }
  33.  
  34.         FreeVecPooled(BitMap);
  35.     }
  36. }
  37.  
  38.     /* LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height):
  39.      *
  40.      *    Create yet another screen bitmap.
  41.      */
  42.  
  43. STATIC struct BitMap * __regargs
  44. LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height)
  45. {
  46.     struct BitMap *BitMap;
  47.  
  48.     if(BitMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  49.     {
  50.         BYTE    Success = TRUE;
  51.         WORD    i;
  52.  
  53.         InitBitMap(BitMap,Depth,Width,Height);
  54.  
  55.         for(i = 0 ; Success && i < Depth ; i++)
  56.         {
  57.             if(!(BitMap -> Planes[i] = AllocRaster(Width,Height)))
  58.                 Success = FALSE;
  59.         }
  60.  
  61.         if(Success)
  62.             return(BitMap);
  63.  
  64.         LocalDeleteBitMap(BitMap,Width,Height);
  65.     }
  66.  
  67.     return(NULL);
  68. }
  69.  
  70.     /* CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap):
  71.      *
  72.      *    Turn an Intuition Image into a Gfx BitMap.
  73.      */
  74.  
  75. STATIC VOID __regargs
  76. CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap)
  77. {
  78.     PLANEPTR    Data    = (PLANEPTR)Image -> ImageData;
  79.     ULONG        Modulo    = ((((ULONG)Image -> Width) + 15) >> 3) & ~1;
  80.     WORD        i;
  81.  
  82.     InitBitMap(BitMap,Image -> Depth,Image -> Width,Image -> Height);
  83.  
  84.     for(i = 0 ; i < Image -> Depth ; i++, Data += Modulo * Image -> Height)
  85.         BitMap -> Planes[i] = Data;
  86. }
  87.  
  88.     /* RecolourBitMap():
  89.      *
  90.      *    Remap a BitMap to use a different colour selection.
  91.      */
  92.  
  93. STATIC struct BitMap * __regargs
  94. RecolourBitMap (struct BitMap *Src, UBYTE * Mapping, UBYTE DestDepth, UWORD Width, UWORD Height)
  95. {
  96.     struct BitMap *Dst;
  97.  
  98.         /* Create the bitmap to hold the remapped data. */
  99.  
  100.     if(Dst = LocalCreateBitMap(DestDepth,Width,Height))
  101.     {
  102.         struct BitMap *SingleMap;
  103.  
  104.             /* Create a single bitplane bitmap. */
  105.  
  106.         if(SingleMap = LocalCreateBitMap(1,Width,Height))
  107.         {
  108.             struct BitMap *FullMap;
  109.  
  110.                 /* Create a dummy bitmap. */
  111.  
  112.             if(FullMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  113.             {
  114.                 WORD i,Mask = (1L << Src -> Depth) - 1;
  115.  
  116.                     /* Make the dummy bitmap use the
  117.                      * single bitmap in all planes.
  118.                      */
  119.  
  120.                 InitBitMap(FullMap,DestDepth,Width,Height);
  121.  
  122.                 for(i = 0 ; i < DestDepth ; i++)
  123.                     FullMap -> Planes[i] = SingleMap -> Planes[0];
  124.  
  125.                     /* Clear the destination bitmap. */
  126.  
  127.                 BltBitMap(Dst,0,0,Dst,0,0,Width,Height,MINTERM_ZERO,0xFF,NULL);
  128.  
  129.                     /* Is colour zero to be mapped to a non-zero colour? */
  130.  
  131.                 if(Mapping[0])
  132.                 {
  133.                         /* Clear the single plane bitmap. */
  134.  
  135.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ZERO,1,NULL);
  136.  
  137.                         /* Merge all source bitplane data. */
  138.  
  139.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_OR_C,Mask,NULL);
  140.  
  141.                         /* Invert the single plane bitmap, to give us
  142.                          * the zero colour bitmap we can work with.
  143.                          */
  144.  
  145.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_NOT_C,1,NULL);
  146.  
  147.                         /* Now set all the bits for colour zero. */
  148.  
  149.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[0],NULL);
  150.                 }
  151.  
  152.                     /* Run down the colours. */
  153.  
  154.                 for(i = 1 ; i <= Mask ; i++)
  155.                 {
  156.                         /* Set the single plane bitmap to all 1's. */
  157.  
  158.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ONE,1,NULL);
  159.  
  160.                         /* Isolate the pixels to match the colour
  161.                          * specified in `i'.
  162.                          */
  163.  
  164.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_AND_C,i,NULL);
  165.  
  166.                     if(Mask ^ i)
  167.                         BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_NOT_B_AND_C,Mask ^ i,NULL);
  168.  
  169.                         /* Set the pixels in the destination bitmap,
  170.                          * use the designated colour.
  171.                          */
  172.  
  173.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[i],NULL);
  174.                 }
  175.  
  176.                     /* Free the temporary bitmap. */
  177.  
  178.                 FreeVecPooled(FullMap);
  179.  
  180.                     /* Free the single plane bitmap. */
  181.  
  182.                 LocalDeleteBitMap(SingleMap,Width,Height);
  183.  
  184.                     /* Return the result. */
  185.  
  186.                 return(Dst);
  187.             }
  188.  
  189.             LocalDeleteBitMap(SingleMap,Width,Height);
  190.         }
  191.  
  192.         LocalDeleteBitMap(Dst,Width,Height);
  193.     }
  194.  
  195.     return(NULL);
  196. }
  197.  
  198.     /* ShowAbout():
  199.      *
  200.      *    Open a window, draw the `term' logo, show some text
  201.      *    and wait for user reaction.
  202.      */
  203.  
  204. BYTE __regargs
  205. ShowAbout(BYTE Ticks)
  206. {
  207.     struct BitMap        *ImageBitMap = NULL;
  208.     LONG             ImageWidth,
  209.                  ImageHeight;
  210.     BYTE             GotRexxMessage = FALSE;
  211.     struct LayoutHandle    *Handle;
  212.  
  213.     if(IconBase)
  214.     {
  215.         struct DiskObject *Icon;
  216.  
  217.         if(Icon = GetProgramIcon())
  218.         {
  219.             STATIC UWORD DefaultColours[4] =
  220.             {
  221.                 0xAAA,
  222.                 0x000,
  223.                 0xFFF,
  224.                 0x68B
  225.             };
  226.  
  227.             UBYTE    Mapping[4];
  228.             UWORD    Colour1,Colour2;
  229.             WORD    ChannelDistance;
  230.             LONG    Distance,BestDistance,BestIndex,Depth,Count,i,j;
  231.             BOOLEAN    Duplicates = FALSE;
  232.  
  233.             Depth = GetBitMapDepth(Window -> RPort -> BitMap);
  234.             Count = Window -> WScreen -> ViewPort . ColorMap -> Count;
  235.  
  236.             if(Count > (1L << Depth))
  237.                 Count = 1L << Depth;
  238.  
  239.             if(Count >= 4)
  240.             {
  241.                 for(i = 0 ; i < 4 ; i++)
  242.                 {
  243.                     Colour2 = DefaultColours[i];
  244.  
  245.                     BestDistance    = 3 * 15 * 15;
  246.                     BestIndex    = 0;
  247.  
  248.                     for(j = 0 ; j < Count ; j++)
  249.                     {
  250.                         Colour1 = GetRGB4(Window -> WScreen -> ViewPort . ColorMap,j);
  251.  
  252.                         ChannelDistance = ((WORD)((Colour1 >> 8) & 0xF)) - ((WORD)((Colour2 >> 8) & 0xF));
  253.  
  254.                         Distance = ChannelDistance * ChannelDistance;
  255.  
  256.                         ChannelDistance = ((WORD)((Colour1 >> 4) & 0xF)) - ((WORD)((Colour2 >> 4) & 0xF));
  257.  
  258.                         Distance += ChannelDistance * ChannelDistance;
  259.  
  260.                         ChannelDistance = ((WORD)(Colour1 & 0xF)) - ((WORD)(Colour2 & 0xF));
  261.  
  262.                         Distance += ChannelDistance * ChannelDistance;
  263.  
  264.                         if(Distance < BestDistance)
  265.                         {
  266.                             BestDistance    = Distance;
  267.                             BestIndex    = j;
  268.                         }
  269.                     }
  270.  
  271.                     Mapping[i] = BestIndex;
  272.                 }
  273.  
  274.                 for(i = 0 ; !Duplicates && i < 4 ; i++)
  275.                 {
  276.                     for(j = i + 1 ; !Duplicates && j < 4 ; j++)
  277.                         Duplicates = (Mapping[i] == Mapping[j]);
  278.                 }
  279.  
  280.                 if(!Duplicates)
  281.                 {
  282.                     struct BitMap     LocalBitMap;
  283.                     struct Image    *Image;
  284.  
  285.                     Image = Icon -> do_Gadget . GadgetRender;
  286.  
  287.                     if(Image -> Depth == 2)
  288.                     {
  289.                         CreateBitMapFromImage(Image,&LocalBitMap);
  290.  
  291.                         if(ImageBitMap = RecolourBitMap(&LocalBitMap,Mapping,Depth,Image -> Width,Image -> Height))
  292.                         {
  293.                             ImageWidth    = Image -> Width;
  294.                             ImageHeight    = Image -> Height;
  295.                         }
  296.                     }
  297.                 }
  298.             }
  299.  
  300.             FreeDiskObject(Icon);
  301.         }
  302.     }
  303.  
  304.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  305.         LH_LocaleHook,    &LocaleHook,
  306.         LH_ExactClone,    TRUE,
  307.     TAG_DONE))
  308.     {
  309.         STRPTR         AboutLines[3],
  310.                  RequestLines[4],
  311.                  StandardMail[4],
  312.                  ElectronicMail[2];
  313.         struct Window    *PanelWindow;
  314.         WORD         i;
  315.  
  316.         for(i = 0 ; i < 2 ; i++)
  317.             AboutLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i);
  318.  
  319.         AboutLines[i] = NULL;
  320.  
  321.         for(i = 0 ; i < 3 ; i++)
  322.             RequestLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT4_TXT + i);
  323.  
  324.         RequestLines[i] = NULL;
  325.  
  326.         for(i = 0 ; i < 3 ; i++)
  327.             StandardMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT10_TXT + i);
  328.  
  329.         StandardMail[i] = NULL;
  330.  
  331.         for(i = 0 ; i < 1 ; i++)
  332.             ElectronicMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT16_TXT + i);
  333.  
  334.         ElectronicMail[i] = NULL;
  335.  
  336.         LT_New(Handle,
  337.             LA_Type,    VERTICAL_KIND,
  338.         TAG_DONE);
  339.         {
  340.             LT_New(Handle,
  341.                 LA_Type,    VERTICAL_KIND,
  342.                 LA_LabelText,    TermName,
  343.             TAG_DONE);
  344.             {
  345.                 if(ImageBitMap)
  346.                 {
  347.                     LT_New(Handle,
  348.                         LA_Type,    VERTICAL_KIND,
  349.                     TAG_DONE);
  350.                     {
  351.                         LT_New(Handle,
  352.                             LA_Type,        FRAME_KIND,
  353.                             LAFR_InnerWidth,    ImageWidth,
  354.                             LAFR_InnerHeight,    ImageHeight,
  355.                             LA_DrawBox,        FALSE,
  356.                             LA_ID,            GAD_FRAME,
  357.                         TAG_DONE);
  358.  
  359.                         LT_EndGroup(Handle);
  360.                     }
  361.                 }
  362.  
  363.                 LT_New(Handle,
  364.                     LA_Type,    VERTICAL_KIND,
  365.                 TAG_DONE);
  366.                 {
  367.                     LT_New(Handle,
  368.                         LA_Type,    BOX_KIND,
  369.                         LA_Chars,    56,
  370.                         LABX_Lines,    AboutLines,
  371.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  372.                         LABX_DrawBox,    FALSE,
  373.                     TAG_DONE);
  374.  
  375.                     LT_EndGroup(Handle);
  376.                 }
  377.  
  378.                 LT_EndGroup(Handle);
  379.             }
  380.  
  381.             LT_New(Handle,
  382.                 LA_Type,    VERTICAL_KIND,
  383.                 LA_LabelID,    MSG_V36_1030,
  384.             TAG_DONE);
  385.             {
  386.                 LT_New(Handle,
  387.                     LA_Type,    VERTICAL_KIND,
  388.                 TAG_DONE);
  389.                 {
  390.                     LT_New(Handle,
  391.                         LA_Type,    BOX_KIND,
  392.                         LA_Chars,    56,
  393.                         LABX_Lines,    RequestLines,
  394.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  395.                         LABX_DrawBox,    FALSE,
  396.                     TAG_DONE);
  397.  
  398.                     LT_EndGroup(Handle);
  399.                 }
  400.  
  401.                 LT_New(Handle,
  402.                     LA_Type,    VERTICAL_KIND,
  403.                     LA_LabelID,    MSG_V36_1031,
  404.                 TAG_DONE);
  405.                 {
  406.                     LT_New(Handle,
  407.                         LA_Type,    BOX_KIND,
  408.                         LA_Chars,    56,
  409.                         LABX_Lines,    StandardMail,
  410.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  411.                         LABX_DrawBox,    FALSE,
  412.                     TAG_DONE);
  413.  
  414.                     LT_EndGroup(Handle);
  415.                 }
  416.  
  417.                 LT_New(Handle,
  418.                     LA_Type,    VERTICAL_KIND,
  419.                     LA_LabelID,    MSG_V36_1032,
  420.                 TAG_DONE);
  421.                 {
  422.                     LT_New(Handle,
  423.                         LA_Type,    BOX_KIND,
  424.                         LA_Chars,    56,
  425.                         LABX_Lines,    ElectronicMail,
  426.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  427.                         LABX_DrawBox,    FALSE,
  428.                     TAG_DONE);
  429.  
  430.                     LT_EndGroup(Handle);
  431.                 }
  432.  
  433.                 LT_EndGroup(Handle);
  434.             }
  435.  
  436.             if(!Ticks)
  437.             {
  438.                 LT_New(Handle,
  439.                     LA_Type,VERTICAL_KIND,
  440.                 TAG_DONE);
  441.                 {
  442.                     LT_New(Handle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  443.  
  444.                     LT_New(Handle,
  445.                         LA_Type,    BUTTON_KIND,
  446.                         LA_LabelID,    MSG_V36_1033,
  447.                         LA_ID,        GAD_BUTTON,
  448.                         LABT_ReturnKey,    TRUE,
  449.                         LABT_ExtraFat,    TRUE,
  450.                     TAG_DONE);
  451.  
  452.                     LT_EndGroup(Handle);
  453.                 }
  454.             }
  455.  
  456.             LT_EndGroup(Handle);
  457.         }
  458.  
  459.         if(!Ticks)
  460.         {
  461.             PanelWindow = LT_Layout(Handle,LocaleString(MSG_V36_1034),NULL,0,0,IDCMP_CLOSEWINDOW,0,
  462.                 LAWN_HelpHook,        &GuideHook,
  463.                 LAWN_MaxPen,        -1,
  464.                 LAWN_Parent,        Window,
  465.                 WA_DepthGadget,        TRUE,
  466.                 WA_CloseGadget,        TRUE,
  467.                 WA_DragBar,        TRUE,
  468.                 WA_RMBTrap,        TRUE,
  469.                 WA_Activate,        TRUE,
  470.             TAG_DONE);
  471.         }
  472.         else
  473.         {
  474.             PanelWindow = LT_Layout(Handle,NULL,NULL,0,0,IDCMP_RAWKEY | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS,0,
  475.                 LAWN_HelpHook,        &GuideHook,
  476.                 LAWN_MaxPen,        -1,
  477.                 LAWN_Parent,        Window,
  478.                 WA_RMBTrap,        TRUE,
  479.                 WA_Activate,        TRUE,
  480.                 WA_ReportMouse,        TRUE,
  481. /*                WA_GimmeZeroZero,    TRUE,*/
  482.             TAG_DONE);
  483.         }
  484.  
  485.         if(PanelWindow)
  486.         {
  487.             struct IntuiMessage    *Message;
  488.             BOOLEAN             Done = FALSE;
  489.             ULONG             MsgClass,
  490.                          MsgQualifier;
  491.             UWORD             MsgCode;
  492.             struct Gadget        *MsgGadget;
  493.             ULONG             Signals;
  494.             LONG             TickCount = 0;
  495.  
  496.             if(ImageBitMap)
  497.             {
  498.                 LONG Left,Top;
  499.  
  500.                 LT_GetAttributes(Handle,GAD_FRAME,
  501.                     LA_Left,    &Left,
  502.                     LA_Top,        &Top,
  503.                 TAG_DONE);
  504.  
  505.                 BltBitMapRastPort(ImageBitMap,0,0,PanelWindow -> RPort,Left,Top,ImageWidth,ImageHeight,MINTERM_COPY);
  506.             }
  507.  
  508.             while(Message = GT_GetIMsg(PanelWindow -> UserPort))
  509.                 GT_ReplyIMsg(Message);
  510.  
  511.             if(!Ticks)
  512.                 PushWindow(PanelWindow);
  513.             else
  514.                 Say(LocaleString(MSG_TERMINFO_WELCOME_TO_TERM_TXT));
  515.  
  516.             do
  517.             {
  518.                 Signals = Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK | SIG_REXX);
  519.  
  520.                 if(Signals & SIG_BREAK)
  521.                     break;
  522.  
  523.                 if(Ticks)
  524.                 {
  525.                     if(Signals & SIG_REXX)
  526.                     {
  527.                         GotRexxMessage = TRUE;
  528.  
  529.                         break;
  530.                     }
  531.                 }
  532.  
  533.                 while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  534.                 {
  535.                     MsgClass    = Message -> Class;
  536.                     MsgQualifier    = Message -> Qualifier;
  537.                     MsgCode        = Message -> Code;
  538.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  539.  
  540.                     GT_ReplyIMsg(Message);
  541.  
  542.                     if(Ticks)
  543.                     {
  544.                         if(MsgClass == IDCMP_INTUITICKS && TickCount++ >= 50)
  545.                             Done = TRUE;
  546.  
  547.                         if((MsgClass == IDCMP_RAWKEY || MsgClass == IDCMP_MOUSEBUTTONS) && !(MsgCode & IECODE_UP_PREFIX))
  548.                             Done = TRUE;
  549.  
  550.                         if(MsgClass == IDCMP_MOUSEMOVE)
  551.                             Done = TRUE;
  552.                     }
  553.                     else
  554.                     {
  555.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  556.  
  557.                         if(MsgClass == IDCMP_CLOSEWINDOW || MsgClass == IDCMP_GADGETUP)
  558.                             Done = TRUE;
  559.                     }
  560.                 }
  561.             }
  562.             while(!Done);
  563.  
  564.             if(!Ticks)
  565.                 PopWindow();
  566.         }
  567.  
  568.         LT_DeleteHandle(Handle);
  569.     }
  570.  
  571.     if(ImageBitMap)
  572.         LocalDeleteBitMap(ImageBitMap,ImageWidth,ImageHeight);
  573.  
  574.     return(GotRexxMessage);
  575. }
  576.