+ getFontCharSource(font_nr, FONT_ASCII_CURSOR, &cursor_bitmap,
+ &cursor_x, &cursor_y);
+
+ BlitBitmap(cursor_bitmap, dst_bitmap, cursor_x, cursor_y,
+ font_width, font_height, dst_x, dst_y);
+ }
+
+ /* second step: draw masked inverted character */
+ SDLCopyInverseMasked(src_bitmap, dst_bitmap, src_x, src_y,
+ font_width, font_height, dst_x, dst_y);
+ }
+ else if (mask_mode == BLIT_MASKED || mask_mode == BLIT_ON_BACKGROUND)
+ {
+ if (mask_mode == BLIT_ON_BACKGROUND)
+ {
+ /* clear font character background */
+ ClearRectangleOnBackground(dst_bitmap, dst_x, dst_y,
+ font_width, font_height);
+ }
+
+ BlitBitmapMasked(src_bitmap, dst_bitmap, src_x, src_y,
+ font_width, font_height, dst_x, dst_y);
+ }
+ else /* normal, non-masked font blitting */
+ {
+ BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y,
+ font_width, font_height, dst_x, dst_y);
+ }
+
+ dst_x += font_width;
+ }
+}
+
+
+/* ========================================================================= */
+/* text buffer drawing functions */
+/* ========================================================================= */
+
+#define MAX_LINES_FROM_FILE 1024
+
+char *GetTextBufferFromFile(char *filename, int max_lines)
+{
+ File *file;
+ char *buffer;
+ int num_lines = 0;
+
+ if (filename == NULL)
+ return NULL;
+
+ if (!(file = openFile(filename, MODE_READ)))
+ return NULL;
+
+ buffer = checked_calloc(1); /* start with valid, but empty text buffer */
+
+ while (!checkEndOfFile(file) && num_lines < max_lines)
+ {
+ char line[MAX_LINE_LEN];
+
+ /* read next line of input file */
+ if (!getStringFromFile(file, line, MAX_LINE_LEN))
+ break;
+
+ buffer = checked_realloc(buffer, strlen(buffer) + strlen(line) + 1);
+
+ strcat(buffer, line);
+
+ num_lines++;
+ }
+
+ closeFile(file);
+
+ return buffer;
+}
+
+static boolean RenderLineToBuffer(char **src_buffer_ptr, char *dst_buffer,
+ int *dst_buffer_len, int line_length,
+ boolean last_line_was_empty)
+{
+ char *text_ptr = *src_buffer_ptr;
+ char *buffer = dst_buffer;
+ int buffer_len = *dst_buffer_len;
+ boolean buffer_filled = FALSE;
+
+ while (*text_ptr)