Advertisement
NovaYoshi

RenderText

Nov 14th, 2014
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.90 KB | None | 0 0
  1. int RenderText(SDL_Renderer *Renderer, FontSet *Font, int X, int Y, RenderTextMode *Mode, const char *Text) {
  2.   SDL_Surface *TextSurface, *RenderSurface;
  3.   int Bold=0, Italic=0, Underline=0, Sup=0, Sub=0, Strike=0, Hidden=0, Link=0;
  4.   int BG=IRCCOLOR_BG, FG=1, Swap;
  5.   SDL_Color FontFG=IRCColors[IRCCOLOR_FG], FontBG=IRCColors[IRCCOLOR_BG];
  6.   int CurDrawX = 0;
  7.   char Text2[strlen(Text)+1], *Poke;
  8.   int SurfaceWidth, SurfaceHeight;
  9.   int WhichFont, TempW, TempH, i;
  10.   char TempHex[7];
  11.   int MaxWidth=0, LineVSpace=0;
  12.  
  13.   int Flags = 0;
  14.   if(Mode) {
  15.     MaxWidth = Mode->MaxWidth;
  16.     LineVSpace = Mode->LineVSpace;
  17.     //MaxHeight = Mode->MaxHeight;
  18.     Flags = Mode->Flags;
  19.   }
  20.  
  21.   char *Stripped = NULL;
  22.   if(Mode && Mode->AlreadyStripped) Stripped = Mode->AlreadyStripped;
  23.   else {
  24.     Stripped = (char*)malloc(strlen(Text)+1);
  25.     StripIRCText(Stripped,Text,0);
  26.   }
  27.  
  28.   TTF_SizeUTF8(Font->Font[0], Stripped, &SurfaceWidth, &SurfaceHeight);
  29.   if(Flags & RENDERMODE_RIGHT_JUSTIFY)
  30.     X -= SurfaceWidth;
  31.  
  32.   RenderSurface = SDL_CreateRGBSurface(0, SurfaceWidth+8, SurfaceHeight+8, 32, 0, 0, 0, 0);
  33.   if(!RenderSurface) return 0;
  34.   SDL_FillRect(RenderSurface, NULL, SDL_MapRGB(RenderSurface->format, IRCColors[IRCCOLOR_BG].r, IRCColors[IRCCOLOR_BG].g, IRCColors[IRCCOLOR_BG].b));
  35.  
  36.   char *Find;
  37.   while(1) {
  38.     unsigned char k = *Text;
  39.     switch(k) {
  40.       case 0xfe:
  41.         break;
  42.       case 0x02:
  43.         Bold ^= 1;
  44.         break;
  45.       case 0x04:
  46.         for(i=1;i<7;i++)
  47.           if(!isxdigit(Text[i])) break;
  48.         if(i==7) {
  49.           memcpy(TempHex, Text+1, 6); // only copy 7
  50.           TempHex[6] = 0;             // null terminator
  51.           i = strtol(TempHex, NULL, 16);
  52.           FontFG.r = (i >> 16) & 255;
  53.           FontFG.g = (i >> 8)  & 255;
  54.           FontFG.b = i & 255;
  55.           Text+=6;
  56.         }
  57.         break;
  58.       case 0x03:
  59.         FG=0;
  60.         if(isdigit(Text[1])) {
  61.           FG = Text[1]-'0';
  62.           Text++;
  63.           if(Text[1] == ',') {
  64.             Text++;
  65.             if(isdigit(Text[1])) {
  66.               BG = Text[1]-'0';
  67.               Text++;
  68.               if(isdigit(Text[1])) {
  69.                 BG = ((BG*10)+(Text[1]-'0'))&31;
  70.                 Text++;
  71.               }
  72.             }
  73.           } else if(isdigit(Text[1])) {
  74.             FG = (FG*10)+(Text[1]-'0');
  75.             Text++;
  76.             if(Text[1] == ',') {
  77.               Text++;
  78.               if(isdigit(Text[1])) {
  79.                 BG = Text[1]-'0';
  80.                 Text++;
  81.                 if(isdigit(Text[1])) {
  82.                   BG = ((BG*10)+(Text[1]-'0'))&31;
  83.                   Text++;
  84.                 }
  85.               }
  86.             }
  87.           }
  88.         }
  89.         FontFG=IRCColors[FG&31];
  90.         FontBG=IRCColors[BG];
  91.         break;
  92.       case 0x0f:
  93.         Bold = 0; Italic = 0;
  94.         Underline = 0; Sup = 0;
  95.         Sub = 0; Strike = 0;
  96.         FontFG=IRCColors[1]; FontBG=IRCColors[IRCCOLOR_BG];
  97.         break;
  98.       case 0x16:
  99.         Swap = BG;
  100.         BG = FG;
  101.         FG = Swap;
  102.         break;
  103.       case 0x1d:
  104.         Italic ^= 1;
  105.         break;
  106.       case 0x1f:
  107.         Underline ^= 1;
  108.         break;
  109.       case 0xff:
  110.         switch((unsigned char)*(++Text)) {
  111.           case FORMAT_SUBSCRIPT:
  112.             Sub ^= 1;
  113.             FontFG=Sub?IRCColors[IRCCOLOR_FADED]:IRCColors[IRCCOLOR_FG];
  114.             break;
  115.           case FORMAT_SUPERSCRIPT:
  116.             Sup ^= 1;
  117.             FontFG=Sub?IRCColors[IRCCOLOR_FADED]:IRCColors[IRCCOLOR_FG];
  118.             break;
  119.           case FORMAT_STRIKEOUT:
  120.             Strike ^= 1;
  121.             break;
  122.           case FORMAT_HIDDEN:
  123.             Hidden ^= 1;
  124.             break;
  125.           case FORMAT_PLAIN_ICON:
  126.             break;
  127.           case FORMAT_ICON_LINK:
  128.             break;
  129.           case FORMAT_URL_LINK:
  130.             Link ^= 1;
  131.             if(Link) {
  132.               Find = strchr(Text, ']');
  133.               if(Find) Text = Find+1;
  134.             }
  135.             break;
  136.           case FORMAT_NICK_LINK:
  137.           case FORMAT_COMMAND_LINK:
  138.             Link ^= 1;
  139.             if(Link) {
  140.               Find = strchr(Text, 0xfe);
  141.               if(Find) Text = Find;
  142.             }
  143.             break;
  144.           case FORMAT_CANCEL_COLORS:
  145.             FontFG=IRCColors[1]; FontBG=IRCColors[IRCCOLOR_BG];
  146.             break;
  147.         }
  148.         break;
  149.       default:
  150.         if(k>=0x20) {
  151.           Poke = Text2;
  152.           while((unsigned char)Text[0]>=0x20 && (unsigned char)Text[0]<0xfe)
  153.             *(Poke++) = *(Text++);
  154.           *Poke = 0;
  155.  
  156.           WhichFont = Bold|(Italic<<1);
  157.           TTF_SizeUTF8(Font->Font[WhichFont], Text2, &TempW, &TempH);
  158.  
  159.           TextSurface=TTF_RenderUTF8_Shaded(Font->Font[WhichFont],Text2,FontFG,FontBG);
  160.           int PixelWidth = UnicodeLen(Text2, NULL)*Font->Width;
  161.           if(Underline) {
  162.             SDL_Rect Fill = {0, TextSurface->h-2, TextSurface->w, 1};
  163.             SDL_FillRect(TextSurface, &Fill, SDL_MapRGB(TextSurface->format, 0, 0, 0));
  164.           }
  165.           if(Strike) {
  166.             SDL_Rect Fill = {0, TextSurface->h/2, TextSurface->w, 1};
  167.             SDL_FillRect(TextSurface, &Fill, SDL_MapRGB(TextSurface->format, 0, 0, 0));
  168.           }
  169.           sblit(TextSurface, RenderSurface, 0, 0, CurDrawX, 0, TextSurface->w, TextSurface->h);
  170.  
  171.           CurDrawX += PixelWidth;
  172.           SDL_FreeSurface(TextSurface);
  173.           Text--; // will ++ after the loop
  174.         }
  175.     }
  176.  
  177.     if(*Text)
  178.       Text++;
  179.     else break;
  180.   }
  181.  
  182.   SDL_Texture *Texture;
  183.   Texture = SDL_CreateTextureFromSurface(Renderer, RenderSurface);
  184.  
  185.   if(Mode)
  186.     Mode->DrawnHeight = Font->Height;
  187.   if(!MaxWidth || (MaxWidth >= RenderSurface->w)) { // no wrap
  188.     blit(Texture, Renderer, 0, 0, X, Y, SurfaceWidth, SurfaceHeight);
  189.   } else { // wrap
  190.     int CharsPerRow = MaxWidth/Font->Width; // floor rounding
  191.     //int RowWidth = CharsPerRow * Font->Width;
  192.     int CurRow = 0;
  193.  
  194.     char *Peek = Stripped;
  195.     int RenderIndex = 0;    // character in Texture
  196.     int CharCount = 0;      // characters read by Peek that count as characters
  197.     int CharCountWord = 0;  // index to the last space
  198.     while(*Peek) {
  199.       if(*Peek<0x80||*Peek>0xbf)
  200.         CharCount++;
  201.       if(*Peek == ' ')
  202.         CharCountWord = CharCount;
  203.       if(!((CharCount-RenderIndex) % CharsPerRow)) {    
  204.         blit(Texture, Renderer, RenderIndex*Font->Width, 0, X, Y+((Font->Height+LineVSpace)*CurRow), (CharCountWord-RenderIndex)*Font->Width, SurfaceHeight);
  205.         RenderIndex = CharCountWord;
  206.         CurRow++;
  207.       }
  208.       Peek++;
  209.     }
  210.     blit(Texture, Renderer, RenderIndex*Font->Width, 0, X, Y+((Font->Height+LineVSpace)*CurRow), (CharCount-RenderIndex)*Font->Width, SurfaceHeight);
  211.     if(Mode)
  212.       Mode->DrawnHeight = (Font->Height+LineVSpace)*(CurRow+1);
  213.   }
  214.   SDL_FreeSurface(RenderSurface);
  215.   SDL_DestroyTexture(Texture);
  216.   if(!Mode || !Mode->AlreadyStripped) free(Stripped);
  217.   return 1;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement