home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Programming / ImageLib / Image_lib / lib_source / DrawText.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-27  |  3.8 KB  |  196 lines

  1. /* DrawText.c © Paweî Marciniak <pmarciniak@lodz.home.pl>*/
  2. #include <string.h>
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include <graphics/text.h>
  6. #include <utility/tagitem.h>
  7. #include <proto/exec.h>
  8. #include <proto/graphics.h>
  9. #include <proto/utility.h>
  10.  
  11. #include "/include/libraries/image.h"
  12.  
  13.  
  14. /**DrawText*************************************************************/
  15.  
  16.  
  17. /* DrawText() (c) 1997 Paweî Marciniak
  18.   Modify date  |  Version  |  Comment
  19. ---------------+-----------+------------------------------
  20. 06-07-97 10:37 |  1.0      |
  21. 14-08-97 15:30 |   2.0     |
  22. */
  23. LONG __saveds __asm DrawTextA( register __a0 struct TagItem * Tags )
  24. {
  25.   struct TagItem *ti, *TagsTmp=Tags;
  26.  
  27.   STRPTR texts=0;
  28.   struct TextFont *TxFontA=0, *TxFontB=0;
  29.   struct RastPort *RastPort=0;
  30.   UWORD Top=0, Left=0, Width=0, Height=0; 
  31.  
  32.   STRPTR text=NULL;
  33.   STRPTR memory=NULL;
  34.  
  35.   char *TextTab[20];
  36.   struct TextFont *TabFont[20];
  37.   int TabStyle[20];
  38.  
  39.   int licznik=0;
  40.   int loop=0, High=0;
  41.  
  42. /* Tags */
  43.   while ( ti = NextTagItem( &TagsTmp ) )
  44.   {
  45.     switch ( ti->ti_Tag )
  46.     {
  47.       case DT_FontA:
  48.         TxFontA = ( struct TextFont * )ti->ti_Data;
  49.       break;
  50.       
  51.       case DT_FontB:
  52.         TxFontB = ( struct TextFont * )ti->ti_Data;
  53.       break;
  54.  
  55.       case DT_Texts:
  56.         texts = ( STRPTR )ti->ti_Data;
  57.       break;
  58.  
  59.       case DT_Top:
  60.         Top = ti->ti_Data;
  61.       break;
  62.  
  63.       case DT_Left:
  64.         Left = ti->ti_Data;
  65.       break;
  66.  
  67.       case DT_Width:
  68.         Width = ti->ti_Data;
  69.       break;
  70.  
  71.       case DT_Height:
  72.         Height = ti->ti_Data;
  73.       break;
  74.  
  75.       case DT_RastPort:
  76.         RastPort = (struct RastPort *)ti->ti_Data;
  77.       break;
  78.       
  79.       default:
  80.       break;
  81.     }
  82.   }
  83.  
  84. /* Alokujemy pamiëê dla tekstu */
  85.   if(!(memory=AllocVec( (strlen(texts)+1), MEMF_PUBLIC )))
  86.     return FALSE;
  87.   text=memory;
  88.  
  89. /* Kopiujemy "texts" do naszej pamiëci "text" */
  90.   strcpy(text, texts);
  91.  
  92. /* Wpisujemy adres pierwszego tekstu do tablicy */
  93.   if(*text == '1')
  94.   {
  95.     TabFont[licznik]=TxFontB;
  96.     text++;
  97.   }
  98.   else
  99.     TabFont[licznik]=TxFontA;
  100.  
  101.   switch(*text)
  102.   {
  103.     case 'b':
  104.  
  105.       TabStyle[licznik]=FSF_BOLD;
  106.       text++;
  107.     break;
  108.  
  109.     case 'i':
  110.  
  111.       TabStyle[licznik]=FSF_ITALIC;
  112.       text++;
  113.     break;
  114.  
  115.     case 'u':
  116.  
  117.       TabStyle[licznik]=FSF_UNDERLINED;
  118.       text++;
  119.     break;
  120.  
  121.     default:
  122.  
  123.       TabStyle[licznik]=FS_NORMAL;
  124.     break;
  125.   }
  126.   TextTab[licznik]=text;
  127.  
  128. /* Zamieniamy wszystkie znaki "\n" na "\0", */
  129. /* i wpisujemy ich adresy do tablicy adresy */
  130. /* Jeôli po '\n' wystâpi znak '1' to ta linia */
  131. /* tekstu zastanie narysowana czcionkâ TxFontB */
  132. /* w przeciwnym przeciwny przypadku TxFontA */
  133.  
  134.   while(*text != '\0')
  135.   {
  136.     if(*text == '\n')
  137.       {
  138.         *text='\0';
  139.         licznik++;
  140.         text++;
  141.         if(*text == '1')
  142.         {
  143.           TabFont[licznik]=TxFontB;
  144.           text++;
  145.         }
  146.         else
  147.           TabFont[licznik]=TxFontA;
  148.  
  149.         switch(*text)
  150.         {
  151.           case 'b':
  152.             TabStyle[licznik]=FSF_BOLD;
  153.             text++;
  154.           break;
  155.  
  156.           case 'i':
  157.             TabStyle[licznik]=FSF_ITALIC;
  158.             text++;
  159.           break;
  160.  
  161.           case 'u':
  162.             TabStyle[licznik]=FSF_UNDERLINED;
  163.             text++;
  164.           break;
  165.  
  166.           default:
  167.             TabStyle[licznik]=FS_NORMAL;
  168.           break;
  169.         }
  170.         TextTab[licznik]=text;
  171.       }
  172.     else
  173.       text++;
  174.   }
  175.  
  176.  
  177.   SetDrMd( RastPort, JAM1 );
  178.   while(loop <= licznik)
  179.   {
  180.     SetFont( RastPort, TabFont[loop] );
  181.     SetSoftStyle( RastPort, TabStyle[loop], FSF_BOLD | FSF_ITALIC | FSF_UNDERLINED );
  182.     Move( RastPort, Left+(Width-(TextLength(RastPort, TextTab[loop], strlen(TextTab[loop]))))/2,
  183.           Top+( RastPort->TxBaseline+loop)+High );
  184.     Text( RastPort, TextTab[loop], strlen(TextTab[loop]) );
  185.  
  186.     High+=(RastPort->TxHeight);
  187.     loop++;
  188.   }
  189.  
  190.   if(memory)
  191.     FreeVec(memory);
  192.   memory=NULL;
  193.  
  194.   return TRUE;
  195. }
  196.