rnd-20021211-1-src
[rocksndiamonds.git] / src / libgame / text.c
index 4e365c60e993a02471c88ef984dd8571618fe252..414c187716422ecf8150a5be6e0a2a9a029991d2 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2000 Artsoft Entertainment                      *
+* (c) 1994-2002 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -28,41 +28,46 @@ struct FontInfo             font;
 /* font functions                                                            */
 /* ========================================================================= */
 
-void InitFontInfo(Bitmap bitmap_big, Bitmap bitmap_medium,
-                 Bitmap bitmap_small)
+void InitFontInfo(Bitmap *bitmap_initial,
+                 Bitmap *bitmap_big, Bitmap *bitmap_medium,
+                 Bitmap *bitmap_small, Bitmap *bitmap_tile)
 {
+  font.bitmap_initial = bitmap_initial;
   font.bitmap_big = bitmap_big;
   font.bitmap_medium = bitmap_medium;
   font.bitmap_small = bitmap_small;
+  font.bitmap_tile = bitmap_tile;
 }
 
 int getFontWidth(int font_size, int font_type)
 {
-  return (font_size == FS_BIG ? FONT1_XSIZE :
-         font_size == FS_MEDIUM ? FONT6_XSIZE :
-         font_type == FC_SPECIAL1 ? FONT3_XSIZE :
+  return (font_type == FC_SPECIAL1 ? FONT3_XSIZE :
          font_type == FC_SPECIAL2 ? FONT4_XSIZE :
          font_type == FC_SPECIAL3 ? FONT5_XSIZE :
+         font_size == FS_BIG ? FONT1_XSIZE :
+         font_size == FS_MEDIUM ? FONT6_XSIZE :
+         font_size == FS_SMALL ? FONT2_XSIZE :
          FONT2_XSIZE);
 }
 
 int getFontHeight(int font_size, int font_type)
 {
-  return (font_size == FS_BIG ? FONT1_YSIZE :
-         font_size == FS_MEDIUM ? FONT6_YSIZE :
-         font_type == FC_SPECIAL1 ? FONT3_YSIZE :
+  return (font_type == FC_SPECIAL1 ? FONT3_YSIZE :
          font_type == FC_SPECIAL2 ? FONT4_YSIZE :
          font_type == FC_SPECIAL3 ? FONT5_YSIZE :
+         font_size == FS_BIG ? FONT1_YSIZE :
+         font_size == FS_MEDIUM ? FONT6_YSIZE :
+         font_size == FS_SMALL ? FONT2_YSIZE :
          FONT2_YSIZE);
 }
 
 void DrawInitText(char *text, int ypos, int color)
 {
-  if (window && font.bitmap_small)
+  if (window && font.bitmap_initial)
   {
     ClearRectangle(window, 0, ypos, video.width, FONT2_YSIZE);
     DrawTextExt(window, (video.width - strlen(text) * FONT2_XSIZE)/2,
-               ypos, text, FS_SMALL, color);
+               ypos, text, FS_INITIAL, color);
     FlushDisplay();
   }
 }
@@ -99,35 +104,45 @@ void DrawText(int x, int y, char *text, int font_size, int font_type)
 
   if (x < gfx.dx)
     redraw_mask |= REDRAW_FIELD;
-  else if (y < gfx.vy)
+  else if (y < gfx.vy || gfx.vy == 0)
     redraw_mask |= REDRAW_DOOR_1;
 }
 
-void DrawTextExt(DrawBuffer bitmap, int x, int y,
-                char *text, int font_size, int font_type)
+void DrawTextExt(DrawBuffer *bitmap, int x, int y, char *text,
+                int font_size, int font_type)
 {
-  Bitmap font_bitmap;
-  int font_width, font_height, font_start;
+  Bitmap *font_bitmap;
+  int font_width, font_height, font_starty;
   boolean print_inverse = FALSE;
 
-  if (font_size != FS_SMALL && font_size != FS_BIG && font_size != FS_MEDIUM)
-    font_size = FS_SMALL;
+  if (font_size != FS_BIG && font_size != FS_MEDIUM && font_size != FS_SMALL)
+    font_size = FS_INITIAL;
   if (font_type < FC_RED || font_type > FC_SPECIAL3)
     font_type = FC_RED;
 
   font_width = getFontWidth(font_size, font_type);
   font_height = getFontHeight(font_size, font_type);
 
-  font_bitmap = (font_size == FS_BIG ? font.bitmap_big :
-                font_size == FS_MEDIUM ? font.bitmap_medium :
-                font.bitmap_small);
-  font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE :
-                            font_size == FS_MEDIUM ? FONT6_YSIZE :
-                            FONT2_YSIZE) *
-               FONT_LINES_PER_FONT);
+  font_bitmap = (font_type == FC_SPECIAL2      ? font.bitmap_tile      :
+                font_size == FS_BIG            ? font.bitmap_big       :
+                font_size == FS_MEDIUM         ? font.bitmap_medium    :
+                font_size == FS_SMALL          ? font.bitmap_small     :
+                font.bitmap_initial);
+
+  if (font_bitmap == NULL)
+    return;
+
+  if (font_type == FC_SPECIAL2)
+    font_starty = (font_size == FS_BIG ? 0 : FONT1_YSIZE) * 5;
+  else
+    font_starty = (font_type * (font_size == FS_BIG ? FONT1_YSIZE :
+                               font_size == FS_MEDIUM ? FONT6_YSIZE :
+                               font_size == FS_SMALL ? FONT2_YSIZE :
+                               FONT2_YSIZE) *
+                  FONT_LINES_PER_FONT);
 
   if (font_type == FC_SPECIAL3)
-    font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT;
+    font_starty -= FONT2_YSIZE * FONT_LINES_PER_FONT;
 
   while (*text)
   {
@@ -147,18 +162,36 @@ void DrawTextExt(DrawBuffer bitmap, int x, int y,
       c = 92;
     else if (c == 'ü' || c == 'Ü')
       c = 93;
+    else if (c == '[' || c == ']')     /* map to normal braces */
+      c = (c == '[' ? '(' : ')');
+    else if (c == '\\')                        /* bad luck ... */
+      c = '/';
 
-    if (c >= 32 && c <= 95)
+    if ((c >= 32 && c <= 95) || c == '°' || c == '´' || c == '|')
     {
       int src_x = ((c - 32) % FONT_CHARS_PER_LINE) * font_width;
-      int src_y = ((c - 32) / FONT_CHARS_PER_LINE) * font_height + font_start;
+      int src_y = ((c - 32) / FONT_CHARS_PER_LINE) * font_height + font_starty;
       int dest_x = x, dest_y = y;
 
+      if (c == '°' || c == '´' || c == '|')    /* map '°' and 'TM' signs */
+      {
+       if (font_type == FC_SPECIAL2)
+       {
+         src_x = (c == '°' ? 1 : c == '´' ? 2 : 3) * font_width;
+         src_y = 4 * font_height;
+       }
+       else
+       {
+         src_x = FONT_CHARS_PER_LINE * font_width;
+         src_y = (c == '°' ? 1 : c == '´' ? 2 : 3) * font_height +font_starty;
+       }
+      }
+
       if (print_inverse)
       {
        BlitBitmap(font_bitmap, bitmap,
                   FONT_CHARS_PER_LINE * font_width,
-                  3 * font_height + font_start,
+                  3 * font_height + font_starty,
                   font_width, font_height, x, y);
 
        SetClipOrigin(font_bitmap, font_bitmap->stored_clip_gc,