rnd-20020914-1-src
[rocksndiamonds.git] / src / libgame / text.c
index 28f88c56019fe51dd4c6a1d711483a8493bf05c9..a31c80f2881fe7bcfb2275fb81326b246e7be3bd 100644 (file)
@@ -1,21 +1,41 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-*  (c) 1995-98 Artsoft Entertainment                       *
-*              Holger Schemel                              *
-*              Oststrasse 11a                              *
-*              33604 Bielefeld                             *
-*              phone: ++49 +521 290471                     *
-*              email: aeglos@valinor.owl.de                *
+* (c) 1994-2002 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  text.c                                                  *
+* text.c                                                   *
 ***********************************************************/
 
+#include <stdio.h>
 #include <stdarg.h>
 
-#include "libgame.h"
+#include "text.h"
 
-#include "main_TMP.h"
+
+/* ========================================================================= */
+/* exported variables                                                        */
+/* ========================================================================= */
+
+struct FontInfo                font;
+
+
+/* ========================================================================= */
+/* font functions                                                            */
+/* ========================================================================= */
+
+void InitFontInfo(Bitmap *bitmap_big, Bitmap *bitmap_medium,
+                 Bitmap *bitmap_small, Bitmap *bitmap_tile)
+{
+  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)
 {
@@ -39,10 +59,10 @@ int getFontHeight(int font_size, int font_type)
 
 void DrawInitText(char *text, int ypos, int color)
 {
-  if (window && pix[PIX_SMALLFONT])
+  if (window && font.bitmap_small)
   {
-    ClearRectangle(window, 0, ypos, WIN_XSIZE, FONT2_YSIZE);
-    DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2,
+    ClearRectangle(window, 0, ypos, video.width, FONT2_YSIZE);
+    DrawTextExt(window, (video.width - strlen(text) * FONT2_XSIZE)/2,
                ypos, text, FS_SMALL, color);
     FlushDisplay();
   }
@@ -50,7 +70,7 @@ void DrawInitText(char *text, int ypos, int color)
 
 void DrawTextFCentered(int y, int font_type, char *format, ...)
 {
-  char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
+  char buffer[MAX_OUTPUT_LINESIZE + 1];
   int font_width = getFontWidth(FS_SMALL, font_type);
   va_list ap;
 
@@ -58,37 +78,37 @@ void DrawTextFCentered(int y, int font_type, char *format, ...)
   vsprintf(buffer, format, ap);
   va_end(ap);
 
-  DrawText(SX + (SXSIZE - strlen(buffer) * font_width) / 2, SY + y,
-          buffer, FS_SMALL, font_type);
+  DrawText(gfx.sx + (gfx.sxsize - strlen(buffer) * font_width) / 2,
+          gfx.sy + y, buffer, FS_SMALL, font_type);
 }
 
 void DrawTextF(int x, int y, int font_type, char *format, ...)
 {
-  char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
+  char buffer[MAX_OUTPUT_LINESIZE + 1];
   va_list ap;
 
   va_start(ap, format);
   vsprintf(buffer, format, ap);
   va_end(ap);
 
-  DrawText(SX + x, SY + y, buffer, FS_SMALL, font_type);
+  DrawText(gfx.sx + x, gfx.sy + y, buffer, FS_SMALL, font_type);
 }
 
 void DrawText(int x, int y, char *text, int font_size, int font_type)
 {
-  DrawTextExt(drawto, gc, x, y, text, font_size, font_type);
+  DrawTextExt(drawto, x, y, text, font_size, font_type);
 
-  if (x < DX)
+  if (x < gfx.dx)
     redraw_mask |= REDRAW_FIELD;
-  else if (y < VY)
+  else if (y < gfx.vy || gfx.vy == 0)
     redraw_mask |= REDRAW_DOOR_1;
 }
 
-void DrawTextExt(DrawBuffer d, GC gc, int x, int y,
+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;
-  int font_bitmap;
   boolean print_inverse = FALSE;
 
   if (font_size != FS_SMALL && font_size != FS_BIG && font_size != FS_MEDIUM)
@@ -99,16 +119,22 @@ void DrawTextExt(DrawBuffer d, GC gc, int x, int y,
   font_width = getFontWidth(font_size, font_type);
   font_height = getFontHeight(font_size, font_type);
 
-  font_bitmap = (font_size == FS_BIG ? PIX_BIGFONT :
-                font_size == FS_MEDIUM ? PIX_MEDIUMFONT :
-                PIX_SMALLFONT);
-  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_small);
+
+  if (font_type == FC_SPECIAL2)
+    font_start = (font_size == FS_BIG ? 0 : FONT1_YSIZE) * FONT_LINES_PER_FONT;
+  else
+    font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE :
+                              font_size == FS_MEDIUM ? FONT6_YSIZE :
+                              FONT2_YSIZE) *
+                 FONT_LINES_PER_FONT);
 
   if (font_type == FC_SPECIAL3)
-    font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT;
+    font_start -= FONT2_YSIZE * FONT_LINES_PER_FONT;
 
   while (*text)
   {
@@ -128,26 +154,37 @@ void DrawTextExt(DrawBuffer d, GC gc, 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 == '´')
     {
       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 dest_x = x, dest_y = y;
 
+      if (c == '°' || c == '´')                /* map '°' and 'TM' signs */
+      {
+       src_x = FONT_CHARS_PER_LINE * font_width;
+       src_y = (c == '°' ? 1 : 2) * font_height + font_start;
+      }
+
       if (print_inverse)
       {
-       BlitBitmap(pix[font_bitmap], d,
+       BlitBitmap(font_bitmap, bitmap,
                   FONT_CHARS_PER_LINE * font_width,
                   3 * font_height + font_start,
                   font_width, font_height, x, y);
 
-       SetClipOrigin(clip_gc[font_bitmap], dest_x - src_x, dest_y - src_y);
-       BlitBitmapMasked(pix_masked[font_bitmap], d,
+       SetClipOrigin(font_bitmap, font_bitmap->stored_clip_gc,
+                     dest_x - src_x, dest_y - src_y);
+       BlitBitmapMasked(font_bitmap, bitmap,
                         0, 0, font_width, font_height, dest_x, dest_y);
       }
       else
-       BlitBitmap(pix[font_bitmap], d,
+       BlitBitmap(font_bitmap, bitmap,
                   src_x, src_y, font_width, font_height, dest_x, dest_y);
     }