rnd-20061101-1-src
[rocksndiamonds.git] / src / libgame / text.c
index de70abc34c6faeb0289e2330ec0cc0347a9981a1..01689a73a5e85f9cef2a424f00157076185a0c18 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment                      *
+* (c) 1994-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -130,6 +130,13 @@ void FreeFontInfo(struct FontBitmapInfo *font_bitmap_info)
   free(font_bitmap_info);
 }
 
+struct FontBitmapInfo *getFontBitmapInfo(int font_nr)
+{
+  int font_bitmap_id = gfx.select_font_function(font_nr);
+
+  return &gfx.font_bitmap_info[font_bitmap_id];
+}
+
 int getFontWidth(int font_nr)
 {
   int font_bitmap_id = gfx.select_font_function(font_nr);
@@ -180,14 +187,20 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y)
 
 void DrawInitText(char *text, int ypos, int font_nr)
 {
-  if (window &&
+  if (window != NULL &&
       gfx.num_fonts > 0 &&
       gfx.font_bitmap_info[font_nr].bitmap != NULL)
   {
-    ClearRectangle(window, 0, ypos, video.width, getFontHeight(font_nr));
-    DrawTextExt(window, (video.width - getTextWidth(text, font_nr)) / 2, ypos,
-               text, font_nr, BLIT_OPAQUE);
-    FlushDisplay();
+    int x = (video.width - getTextWidth(text, font_nr)) / 2;
+    int y = ypos;
+    int width = video.width;
+    int height = getFontHeight(font_nr);
+
+    ClearRectangle(drawto, 0, y, width, height);
+    DrawTextExt(drawto, x, y, text, font_nr, BLIT_OPAQUE);
+
+    /* this makes things significantly faster than directly drawing to window */
+    BlitBitmap(drawto, window, 0, y, width, height, 0, y);
   }
 }
 
@@ -233,6 +246,18 @@ void DrawTextSCentered(int y, int font_nr, char *text)
           gfx.sy + y, text, font_nr);
 }
 
+void DrawTextSAligned(int x, int y, char *text, int font_nr, int align)
+{
+  DrawText(gfx.sx + ALIGNED_XPOS(x, getTextWidth(text, font_nr), align),
+          gfx.sx + y, text, font_nr);
+}
+
+void DrawTextAligned(int x, int y, char *text, int font_nr, int align)
+{
+  DrawText(ALIGNED_XPOS(x, getTextWidth(text, font_nr), align),
+          y, text, font_nr);
+}
+
 void DrawText(int x, int y, char *text, int font_nr)
 {
   int mask_mode = BLIT_OPAQUE;
@@ -251,23 +276,33 @@ void DrawText(int x, int y, char *text, int font_nr)
 void DrawTextExt(DrawBuffer *dst_bitmap, int dst_x, int dst_y, char *text,
                 int font_nr, int mask_mode)
 {
+#if 1
+  struct FontBitmapInfo *font = getFontBitmapInfo(font_nr);
+#else
   int font_bitmap_id = gfx.select_font_function(font_nr);
   struct FontBitmapInfo *font = &gfx.font_bitmap_info[font_bitmap_id];
+#endif
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
+#if 0
   int border_1 = gfx.sx + gfx.sxsize;
   int border_2 = gfx.dx + gfx.dxsize;
+  int dst_x_start = dst_x;
+#endif
   Bitmap *src_bitmap;
   int src_x, src_y;
-  int dst_x_start = dst_x;
   char *text_ptr = text;
 
   if (font->bitmap == NULL)
     return;
 
+  /* skip text to be printed outside the window (left/right will be clipped) */
+  if (dst_y < 0 || dst_y + font_height > video.height)
+    return;
+
   /* add offset for drawing font characters */
-  dst_x += font->draw_x;
-  dst_y += font->draw_y;
+  dst_x += font->draw_xoffset;
+  dst_y += font->draw_yoffset;
 
   while (*text_ptr)
   {
@@ -278,10 +313,24 @@ void DrawTextExt(DrawBuffer *dst_bitmap, int dst_x, int dst_y, char *text,
 
     getFontCharSource(font_nr, c, &src_bitmap, &src_x, &src_y);
 
-    /* make sure that text does not run off the screen at the right side */
+    /* clip text at the left side of the window */
+    if (dst_x < 0)
+    {
+      dst_x += font_width;
+
+      continue;
+    }
+
+    /* clip text at the right side of the window */
+#if 1
+    if (dst_x + font_width > video.width)
+      break;
+#else
+    /* (this does not work well when trying to print text to whole screen) */
     if ((dst_x_start < border_1 && dst_x + font_width > border_1) ||
        (dst_x_start < border_2 && dst_x + font_width > border_2))
       break;
+#endif
 
     if (mask_mode == BLIT_INVERSE)     /* special mode for text gadgets */
     {