home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / source.lha / src / RSysShowFont.c < prev    next >
C/C++ Source or Header  |  1995-01-09  |  11KB  |  458 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *    RSysShowFont.c
  6. *
  7. * Inhalt:
  8. *    void ShowFont(struct TextFont *tf);
  9. *
  10. * Bemerkungen:
  11. *    Enthält die Routinen zur Darstellung eines beliebig
  12. *    großen Fonts. Benutzt Clip-Routinen der Layers-Library.
  13. *
  14. * Erstellungsdatum:
  15. *    12-Jul-93    Rolf Böhme
  16. *
  17. * Änderungen:
  18. *    12-Jul-93    Rolf Böhme    Erstellung
  19. *
  20. ***************************************************************************
  21. */
  22.  
  23. #include <clib/layers_protos.h>
  24.  
  25. #include "RSysDebug.h"
  26. #include "RSysFunc.h"
  27.  
  28. enum
  29. {
  30.    GD_NormalCGad,
  31.    GD_ItalicCGad,
  32.    GD_BoldCGad,
  33.    GD_UnderlineCGad
  34. };
  35.  
  36. static int NormalCGadClicked(void);
  37. static int ItalicCGadClicked(void);
  38. static int BoldCGadClicked(void);
  39. static int UnderlineCGadClicked(void);
  40. static int HandleShowFontIDCMP(void);
  41.  
  42. static struct Window *ShowFontWnd = NULL;
  43. static struct Gadget *ShowFontGList = NULL;
  44. static struct IntuiMessage ShowFontMsg;
  45. static struct Gadget *ShowFontGadgets[4];
  46. static UWORD ShowFontLeft = 0;
  47. static UWORD ShowFontTop = 0;
  48. static UWORD ShowFontWidth = 500;
  49. static UWORD ShowFontHeight = 120;
  50. static UBYTE *ShowFontWdt = (UBYTE *) NAME " - Show Font";
  51. static char *testtext;
  52. static struct IntuiText ShowFontIText[]=
  53. {
  54.    1, 2, JAM2, 76, 11, NULL, NULL, NULL
  55. };
  56.  
  57. #define ShowFont_TNUM 1
  58.  
  59. static struct TextAttr testfont;
  60.  
  61. static UWORD ShowFontGTypes[]=
  62. {
  63.    CHECKBOX_KIND,
  64.    CHECKBOX_KIND,
  65.    CHECKBOX_KIND,
  66.    CHECKBOX_KIND,
  67.    BUTTON_KIND
  68. };
  69.  
  70. static struct NewGadget ShowFontNGad[]=
  71. {
  72.    12, 104, 26, 11, (UBYTE *) "Normal", NULL, GD_NormalCGad, PLACETEXT_RIGHT, NULL, (APTR) NormalCGadClicked,
  73.    141, 104, 26, 11, (UBYTE *) "Italic", NULL, GD_ItalicCGad, PLACETEXT_RIGHT, NULL, (APTR) ItalicCGadClicked,
  74.    270, 104, 26, 11, (UBYTE *) "Bold", NULL, GD_BoldCGad, PLACETEXT_RIGHT, NULL, (APTR) BoldCGadClicked,
  75.    400, 104, 26, 11, (UBYTE *) "Underl", NULL, GD_UnderlineCGad, PLACETEXT_RIGHT, NULL, (APTR) UnderlineCGadClicked,
  76. };
  77.  
  78. static ULONG *ShowFontGTags[]=
  79. {
  80.    (ULONG *) (GTCB_Checked), (ULONG *) TRUE, (ULONG *) (TAG_DONE),
  81.    (ULONG *) (TAG_DONE),
  82.    (ULONG *) (TAG_DONE),
  83.    (ULONG *) (TAG_DONE),
  84. };
  85.  
  86. static long bevelbox[4];
  87.  
  88. struct Library *LayersBase = NULL;
  89.  
  90. static void
  91. unclipWindow(struct Window *win)
  92. {
  93.    struct Region *old_region;
  94.  
  95.    if (NULL != (old_region = InstallClipRegion(win->WLayer, NULL)))
  96.       DisposeRegion(old_region);
  97. }
  98.  
  99. static void
  100. clipWindow(struct Window *win, LONG minX, LONG minY, LONG maxX, LONG maxY)
  101. {
  102.    struct Region *new_region;
  103.    struct Rectangle my_rectangle;
  104.  
  105.    my_rectangle.MinX = minX;
  106.    my_rectangle.MinY = minY;
  107.    my_rectangle.MaxX = maxX;
  108.    my_rectangle.MaxY = maxY;
  109.  
  110.    /* get a new region and OR in the limits. */
  111.    if (NULL != (new_region = NewRegion()))
  112.    {
  113.       if (FALSE == OrRectRegion(new_region, &my_rectangle))
  114.       {
  115.          DisposeRegion(new_region);
  116.          new_region = NULL;
  117.       }
  118.    }
  119.  
  120.    InstallClipRegion(win->WLayer, new_region);
  121.  
  122.    return;
  123. }
  124.  
  125. static void
  126. ShowFontRender(struct TextAttr *tfont)
  127. {
  128.    struct IntuiText it;
  129.    int   ilen;
  130.  
  131.    EraseRect(ShowFontWnd->RPort,
  132.              bevelbox[0] + 2, bevelbox[1] + 1,
  133.              bevelbox[0] + bevelbox[2] - 3, bevelbox[1] + bevelbox[3] - 2);
  134.  
  135.    CopyMem((char *)&ShowFontIText[0], (char *)&it, (long)sizeof(struct IntuiText));
  136.  
  137.    it.IText = (STRPTR) testtext;
  138.    it.ITextFont = tfont;
  139.  
  140.    ilen = IntuiTextLength(&it);
  141.  
  142.    it.LeftEdge = bevelbox[0] + ((bevelbox[2] - ilen) / 2);
  143.    it.LeftEdge = (it.LeftEdge < bevelbox[0]) ? bevelbox[0] + 2 : it.LeftEdge;
  144.  
  145.    it.TopEdge = bevelbox[1] + ((bevelbox[3] - tfont->ta_YSize) / 2);
  146.    it.TopEdge = (it.TopEdge < bevelbox[1]) ? bevelbox[1] + 1 : it.TopEdge;
  147.  
  148.    PrintIText(ShowFontWnd->RPort, &it, 0, 0);
  149.  
  150.    return;
  151. }
  152.  
  153. static int
  154. OpenShowFontWindow(void)
  155. {
  156.    struct NewGadget ng;
  157.    struct Gadget *g;
  158.    UWORD lc,
  159.          tc;
  160.    UWORD wleft = ShowFontLeft,
  161.          wtop = ShowFontTop,
  162.          ww,
  163.          wh;
  164.    int   gl[] = {0};
  165.  
  166.    ComputeFont(Scr, ShowFontWidth, ShowFontHeight);
  167.  
  168.    ww = compute((UWORD) 0, FontX, (int)ShowFontWidth);
  169.    wh = compute((UWORD) 0, FontY, (int)ShowFontHeight);
  170.  
  171.    if ((wleft + ww + OffX + Scr->WBorRight) > Scr->Width)
  172.       wleft = Scr->Width - ww;
  173.    if ((wtop + wh + OffY + Scr->WBorBottom) > Scr->Height)
  174.       wtop = Scr->Height - wh;
  175.  
  176.    ww = compute((UWORD) (OffX + Scr->WBorRight), FontX, (int)ShowFontWidth);
  177.    wh = compute((UWORD) (OffY + Scr->WBorBottom), FontY, (int)ShowFontHeight);
  178.  
  179.    CenterWindow(Scr, &wtop, &wleft, ww, wh);
  180.  
  181.    if (!(g = CreateContext(&ShowFontGList)))
  182.       return (1L);
  183.  
  184.    for (lc = 0, tc = 0; lc < 4; lc++)
  185.    {
  186.  
  187.       CopyMem((char *)&ShowFontNGad[lc], (char *)&ng, (long)sizeof(struct NewGadget));
  188.  
  189.       ng.ng_VisualInfo = VisualInfo;
  190.       ng.ng_TextAttr = Font;
  191.       ng.ng_LeftEdge = OffX + ComputeX(ng.ng_LeftEdge);
  192.       ng.ng_TopEdge = OffY + ComputeY(ng.ng_TopEdge);
  193.       ng.ng_Width = ComputeX(ng.ng_Width);
  194.       ng.ng_Height = ComputeY(ng.ng_Height);
  195.  
  196.       ShowFontGadgets[lc] = g = CreateGadgetA((ULONG) ShowFontGTypes[lc], g, &ng, (struct TagItem *) & ShowFontGTags[tc]);
  197.       makelabelvisible(ShowFontGadgets[lc]);
  198.  
  199.       while (ShowFontGTags[tc])
  200.          tc += 2;
  201.       tc++;
  202.  
  203.       if (NOT g)
  204.          return (2L);
  205.    }
  206.  
  207.    bevelbox[0] = OffX + ComputeX((UWORD) 12);
  208.    bevelbox[1] = OffY + ComputeY((UWORD) 5);
  209.    bevelbox[2] = (long)ComputeX((UWORD) 477);
  210.    bevelbox[3] = (long)ComputeY((UWORD) 93);
  211.  
  212.    sprintf(testtext, "(%ld) %s", testfont.ta_YSize, testfont.ta_Name);
  213.  
  214.    if (!(ShowFontWnd = OpenWindowTags(NULL,
  215.                                       WA_Left, wleft,
  216.                                       WA_Top, wtop,
  217.                                       WA_Width, ww,
  218.                                       WA_Height, wh,
  219.                                       WA_IDCMP,
  220.                                       TEXTIDCMP | CHECKBOXIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW |
  221.                                       IDCMP_REFRESHWINDOW | VANILLAKEY,
  222.                                       WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
  223.                                       WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  224.                                       WA_Gadgets, ShowFontGList,
  225.                                       WA_Title, ShowFontWdt,
  226.                                       WA_PubScreenFallBack, TRUE,
  227.                                       WA_PubScreen, Scr,
  228.                                       TAG_DONE)))
  229.       return (4L);
  230.  
  231.    RefreshRastPort(ShowFontWnd, ShowFontGadgets, gl, 0);
  232.  
  233.    EraseRect(ShowFontWnd->RPort,
  234.              bevelbox[0] + 2, bevelbox[1] + 1,
  235.              bevelbox[0] + bevelbox[2] - 3, bevelbox[1] + bevelbox[3] - 2);
  236.  
  237.    DrawBevelBox(ShowFontWnd->RPort,
  238.                 bevelbox[0], bevelbox[1],
  239.                 bevelbox[2], bevelbox[3],
  240.                 GT_VisualInfo, VisualInfo,
  241.                 GTBB_Recessed, TRUE,
  242.                 TAG_DONE);
  243.  
  244.    clipWindow(ShowFontWnd, bevelbox[0] + 4, bevelbox[1] + 2,
  245.               bevelbox[0] + bevelbox[2] - 6, bevelbox[1] + bevelbox[3] - 4);
  246.  
  247.    ShowFontRender(&testfont);
  248.  
  249.    GT_RefreshWindow(ShowFontWnd, NULL);
  250.  
  251.    return (0L);
  252. }
  253.  
  254. static int flags[4] =
  255. {TRUE, FALSE, FALSE, FALSE},
  256.       defflags[4] =
  257. {TRUE, FALSE, FALSE, FALSE};
  258. static int attributes[4] =
  259. {FS_NORMAL, FSF_ITALIC, FSF_BOLD, FSF_UNDERLINED};
  260.  
  261. static void
  262. SetAttr(int attrib)
  263. {
  264.    int   i;
  265.    int   newattr;
  266.  
  267.    if (attrib != FS_NORMAL)
  268.    {
  269.       newattr = 0;
  270.  
  271.       for (i = 0; i < 4; i++)
  272.          newattr |= (flags[i] == TRUE) ? attributes[i] : 0;
  273.    }
  274.    else
  275.       newattr = FS_NORMAL;
  276.  
  277.    testfont.ta_Style = newattr;
  278.  
  279.    ShowFontRender(&testfont);
  280.  
  281.    return;
  282. }
  283.  
  284. static void
  285. Set(int num, int checked)
  286. {
  287.    flags[num] = checked;
  288.  
  289.    GT_SetGadgetAttrs(ShowFontGadgets[num], ShowFontWnd,
  290.                      NULL,
  291.                      GTCB_Checked, flags[num],
  292.                      TAG_DONE);
  293.  
  294.    return;
  295. }
  296.  
  297. static void
  298. IsNoAttrib(void)
  299. {
  300.    if (!flags[1] && !flags[2] && !flags[3])
  301.       Set(0, TRUE);
  302.  
  303.    return;
  304. }
  305.  
  306. static int
  307. NormalCGadClicked(void)
  308. {
  309.    int   i;
  310.  
  311.    if (!flags[GD_NormalCGad])
  312.       SetAttr(attributes[0]);
  313.  
  314.    Set((int)GD_NormalCGad, TRUE);
  315.  
  316.    for (i = GD_ItalicCGad; i <= GD_UnderlineCGad; i++)
  317.       Set(i, FALSE);
  318.  
  319.    return TRUE;
  320. }
  321.  
  322. static int
  323. ItalicCGadClicked(void)
  324. {
  325.    /* routine when gadget "Italic" is clicked. */
  326.    Set((int)GD_NormalCGad, FALSE);
  327.  
  328.    flags[GD_ItalicCGad] = (flags[GD_ItalicCGad] == TRUE) ? FALSE : TRUE;
  329.  
  330.    SetAttr(attributes[1]);
  331.  
  332.    IsNoAttrib();
  333.  
  334.    return TRUE;
  335. }
  336.  
  337. static int
  338. BoldCGadClicked(void)
  339. {
  340.    /* routine when gadget "Bold" is clicked. */
  341.    Set((int)GD_NormalCGad, FALSE);
  342.  
  343.    flags[GD_BoldCGad] = (flags[GD_BoldCGad] == TRUE) ? FALSE : TRUE;
  344.  
  345.    SetAttr(attributes[2]);
  346.  
  347.    IsNoAttrib();
  348.  
  349.    return TRUE;
  350. }
  351.  
  352. static int
  353. UnderlineCGadClicked(void)
  354. {
  355.    /* routine when gadget "Underline" is clicked. */
  356.    Set((int)GD_NormalCGad, FALSE);
  357.  
  358.    flags[GD_UnderlineCGad] = (flags[GD_UnderlineCGad] == TRUE) ? FALSE : TRUE;
  359.  
  360.    SetAttr(attributes[3]);
  361.  
  362.    IsNoAttrib();
  363.  
  364.    return TRUE;
  365. }
  366.  
  367. static int
  368. HandleShowFontIDCMP(void)
  369. {
  370.    struct IntuiMessage *m;
  371.    int   (*func) (void);
  372.    BOOL  running = TRUE;
  373.  
  374.    while (m = GT_GetIMsg(ShowFontWnd->UserPort))
  375.    {
  376.  
  377.       CopyMem((char *)m, (char *)&ShowFontMsg, (long)sizeof(struct IntuiMessage));
  378.  
  379.       GT_ReplyIMsg(m);
  380.  
  381.       switch (ShowFontMsg.Class)
  382.       {
  383.  
  384.          case IDCMP_REFRESHWINDOW:
  385.             GT_BeginRefresh(ShowFontWnd);
  386.             GT_EndRefresh(ShowFontWnd, TRUE);
  387.             break;
  388.  
  389.          case IDCMP_VANILLAKEY:
  390.             if ((char)ShowFontMsg.Code == ESC)
  391.                running = FALSE;
  392.             break;
  393.  
  394.          case IDCMP_CLOSEWINDOW:
  395.             running = FALSE;
  396.             break;
  397.  
  398.          case IDCMP_GADGETUP:
  399.             func = (void *)((struct Gadget *) ShowFontMsg.IAddress)->UserData;
  400.             running = func();
  401.             break;
  402.       }
  403.    }
  404.    return (running);
  405. }
  406.  
  407. void
  408. ShowFont(struct TextFont *tf)
  409. {
  410.    int   i;
  411.    APTR  req;
  412.  
  413.    DPOS;
  414.  
  415.    PrintInfo("Show font", SPEAK, 0);
  416.  
  417.    if (LayersBase = OpenLibrary((STRPTR) "layers.library", 36))
  418.    {
  419.       req = LockWindow(SysWnd);
  420.  
  421.       for (i = 0; i < 4; i++)
  422.          flags[i] = defflags[i];
  423.  
  424.       testtext = MyAllocVec(strlen(tf->tf_Message.mn_Node.ln_Name) + 10,
  425.                             MEMF_CLEAR, NO_KILL);
  426.  
  427.       if (testtext)
  428.       {
  429.          testfont.ta_Name = (STRPTR) tf->tf_Message.mn_Node.ln_Name;
  430.          testfont.ta_YSize = tf->tf_YSize;
  431.          testfont.ta_Style = 0;
  432.          testfont.ta_Flags = 0;
  433.  
  434.          if (OpenASysWindow(OpenShowFontWindow, NO_KILL))
  435.          {
  436.             while (HandleShowFontIDCMP()) ;
  437.  
  438.             unclipWindow(ShowFontWnd);
  439.  
  440.             CloseASysWindow(&ShowFontWnd, &ShowFontGList, NULL);
  441.          }
  442.  
  443.          MyFreeVec(testtext);
  444.       }
  445.  
  446.       UnlockWindow(req);
  447.  
  448.       CloseLibrary(LayersBase);
  449.       LayersBase = NULL;
  450.    }
  451.    else
  452.       ErrorHandle(LIBRARY_ERR, OPEN_FAIL, KILL);
  453.  
  454.    PrintStatistics();
  455.  
  456.    return;
  457. }
  458.