text: /* test ttrender */
  
  #define __NOLIBBASE__
  
  #include <proto/dos.h>
  #include <proto/exec.h>
  #include <proto/intuition.h>
  #include <proto/graphics.h>
  #include <proto/ttengine.h>
  #include <proto/asl.h>
  
  #include <libraries/ttengine.h>
  
  extern struct Library *SysBase, *DOSBase;
  
  struct Library *TTEngineBase, *IntuitionBase, *GfxBase, *AslBase;
  
  /*----------------------------------------------------------------------------------------------------*/
  
  static STRPTR get_font_name(struct Library *AslBase)
    {
      struct FileRequester *freq;
      STRPTR name = NULL;
  
      if (freq = AllocAslRequestTags(ASL_FileRequest, TAG_END))
        {
          if (AslRequestTags(freq,
            ASLFR_TitleText, (ULONG)"Select TrueType font",
            ASLFR_InitialDrawer, (ULONG)"FONTS:",
            ASLFR_DoPatterns, TRUE,
            ASLFR_InitialPattern, (ULONG)"#?.ttf",
            ASLFR_RejectIcons, TRUE,
            TAG_END))
            {
              ULONG namelen = strlen(freq->fr_File) + strlen(freq->fr_Drawer) + 4;
  
              if (name = AllocVec(namelen + 1, MEMF_ANY | MEMF_CLEAR))
                {
                  strncpy(name, freq->fr_Drawer, namelen);
                  AddPart(name, freq->fr_File, namelen);
                }
            }
          FreeAslRequest(freq);
        }
      return name;
    }
  
  /*----------------------------------------------------------------------------------------------------*/
  
  static VOID free_font_name(STRPTR name)
    {
      if (name) FreeVec(name);
    }
  
  /*----------------------------------------------------------------------------------------------------*/
  
  void measured_text(STRPTR text, UWORD y, struct RastPort *rp)
    {
      struct TextExtent te;
      UWORD len;
      ULONG pixlen;
  
      len = strlen(text);
      pixlen = TT_TextLength(rp, text, len);
  
      SetAPen(rp, 2);
      Move(rp, 10, y);
      Draw(rp, 10, y + 7);
      Move(rp, 10, y + 5);
      Draw(rp, 10 + pixlen, y + 5);
      Move(rp, 10 + pixlen, y);
      Draw(rp, 10 + pixlen, y + 7);
  
      SetAPen(rp, 1);
      Move(rp, 10, y);
      TT_Text(rp, text, len);
    }
  
  
  int Main (void)
    {
      struct Window *win;
      STRPTR fontname;
  
      if (GfxBase = OpenLibrary("graphics.library", 39))
        {
          if (IntuitionBase = OpenLibrary("intuition.library", 39))
            {
              if (AslBase = OpenLibrary("asl.library", 38))
                {
                  if (fontname = get_font_name(AslBase))
                    {
                      if (TTEngineBase = OpenLibrary("ttengine.library", 0))
                        {
                          if (win = OpenWindowTags(NULL,
                            WA_Top, 25,
                            WA_Left, 0,
                            WA_Width, 640,
                            WA_Height, 210,
                            WA_CloseGadget, TRUE,
                            WA_DragBar, TRUE,
                            WA_DepthGadget, TRUE,
                            WA_IDCMP, IDCMP_CLOSEWINDOW,
                            WA_Title, (ULONG)"TT_TextLength() test",
                            TAG_END))
                            {
                              ULONG sigmask, signals;
                              BOOL running = TRUE;
                              struct RastPort *rp = win->RPort;
                              APTR font;
  
                              if (font = TT_OpenFont(
                                TT_FontFile, (ULONG)fontname,
                                TT_FontSize, 18,
                                TT_ScaleX, 0x3FA28F5C,
                              TAG_END))
                                {
                                  if (TT_SetFont(rp, font))
                                    {
                                      TT_SetAttrs(rp,
                                        TT_Window, (ULONG)win,
                                      TAG_END);
  
                                      SetDrMd(rp, JAM1);
  
                                      measured_text("TT_TextLength() example", 45, rp);
                                      measured_text("White lines shows text length in pixels as computed by the function.", 70, rp);
                                      measured_text("Note that TT_TextLength() returns only \"pen advance\".", 95, rp);
                                      measured_text("Use TT_TextExtent() if you want to get precise bounding box.", 120, rp);
                                    }
                                  else PutStr("TT_SetFont() failed.\n");
                                  TT_CloseFont(font);
                                }
                              else PutStr("Font open failed.\n");
  
                              sigmask = SIGBREAKF_CTRL_C | (1 << win->UserPort->mp_SigBit);
                              while (running)
                                {
                                  signals = Wait(sigmask);
                                  if (signals & SIGBREAKF_CTRL_C) running = FALSE;
                                  if (signals & (1 << win->UserPort->mp_SigBit))
                                    {
                                      struct IntuiMessage *imsg;
  
                                      while (imsg = (struct IntuiMessage*)GetMsg(win->UserPort))
                                        {
                                          if (imsg->Class == IDCMP_CLOSEWINDOW) running = FALSE;
                                          ReplyMsg((struct Message*)imsg);
                                        }
                                    }
                                }
                              TT_DoneRastPort(win->RPort);
                              CloseWindow(win);
                            }
                          CloseLibrary(TTEngineBase);
                        }
                      free_font_name(fontname);
                    }
                  CloseLibrary(AslBase);
                }
              CloseLibrary(IntuitionBase);
            }
          CloseLibrary(GfxBase);
        }
      return 0;
    }
  