X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Ftext.c;h=77edb425da903ca6f35043cb32adc7be79e56cba;hp=8f8bf8f6d9f4fbfbcaa2b4ad125298832bfc969a;hb=abe44529b439ad39b4d8dbf19cbd67c9b9844279;hpb=6e44f03074b9b879f97c4ce873962649f9699d2e diff --git a/src/libgame/text.c b/src/libgame/text.c index 8f8bf8f6..77edb425 100644 --- a/src/libgame/text.c +++ b/src/libgame/text.c @@ -1,15 +1,13 @@ -/*********************************************************** -* Artsoft Retro-Game Library * -*----------------------------------------------------------* -* (c) 1994-2006 Artsoft Entertainment * -* Holger Schemel * -* Detmolder Strasse 189 * -* 33604 Bielefeld * -* Germany * -* e-mail: info@artsoft.org * -*----------------------------------------------------------* -* text.c * -***********************************************************/ +// ============================================================================ +// Artsoft Retro-Game Library +// ---------------------------------------------------------------------------- +// (c) 1995-2014 by Artsoft Entertainment +// Holger Schemel +// info@artsoft.org +// http://www.artsoft.org/ +// ---------------------------------------------------------------------------- +// text.c +// ============================================================================ #include #include @@ -22,90 +20,6 @@ /* font functions */ /* ========================================================================= */ -#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) -static GC font_clip_gc = None; - -static void InitFontClipmasks() -{ - XGCValues clip_gc_values; - unsigned int clip_gc_valuemask; - GC copy_clipmask_gc; - int i, j; - - /* This stuff is needed because X11 (XSetClipOrigin(), to be precise) is - often very slow when preparing a masked XCopyArea() for big Pixmaps. - To prevent this, create small (tile-sized) mask Pixmaps which will then - be set much faster with XSetClipOrigin() and speed things up a lot. */ - - clip_gc_values.graphics_exposures = False; - clip_gc_valuemask = GCGraphicsExposures; - font_clip_gc = XCreateGC(display, window->drawable, - clip_gc_valuemask, &clip_gc_values); - - /* create graphic context structures needed for clipping */ - clip_gc_values.graphics_exposures = False; - clip_gc_valuemask = GCGraphicsExposures; - copy_clipmask_gc = XCreateGC(display, - gfx.font_bitmap_info[0].bitmap->clip_mask, - clip_gc_valuemask, &clip_gc_values); - - /* create only those clipping Pixmaps we really need */ - for (i = 0; i < gfx.num_fonts; i++) - { - if (gfx.font_bitmap_info[i].bitmap == NULL) - continue; - - gfx.font_bitmap_info[i].clip_mask = - checked_calloc(gfx.font_bitmap_info[i].num_chars * sizeof(Pixmap)); - - for (j = 0; j < gfx.font_bitmap_info[i].num_chars; j++) - { - Bitmap *src_bitmap = gfx.font_bitmap_info[i].bitmap; - Pixmap src_pixmap = src_bitmap->clip_mask; - int xpos = j % gfx.font_bitmap_info[i].num_chars_per_line; - int ypos = j / gfx.font_bitmap_info[i].num_chars_per_line; - int width = gfx.font_bitmap_info[i].width; - int height = gfx.font_bitmap_info[i].height; - int src_x = gfx.font_bitmap_info[i].src_x + xpos * width; - int src_y = gfx.font_bitmap_info[i].src_y + ypos * height; - - gfx.font_bitmap_info[i].clip_mask[j] = - XCreatePixmap(display, window->drawable, width, height, 1); - - XCopyArea(display, src_pixmap, gfx.font_bitmap_info[i].clip_mask[j], - copy_clipmask_gc, src_x, src_y, width, height, 0, 0); - } - } - - XFreeGC(display, copy_clipmask_gc); -} - -static void FreeFontClipmasks() -{ - int i, j; - - if (gfx.num_fonts == 0 || gfx.font_bitmap_info[0].bitmap == NULL) - return; - - for (i = 0; i < gfx.num_fonts; i++) - { - if (gfx.font_bitmap_info[i].clip_mask) - { - for (j = 0; j < gfx.font_bitmap_info[i].num_chars; j++) - XFreePixmap(display, gfx.font_bitmap_info[i].clip_mask[j]); - free(gfx.font_bitmap_info[i].clip_mask); - } - - gfx.font_bitmap_info[i].clip_mask = NULL; - gfx.font_bitmap_info[i].num_chars = 0; - } - - if (font_clip_gc) - XFreeGC(display, font_clip_gc); - font_clip_gc = None; -} -#endif /* TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND */ - void InitFontInfo(struct FontBitmapInfo *font_bitmap_info, int num_fonts, int (*select_font_function)(int), int (*get_font_from_token_function)(char *)) @@ -114,10 +28,6 @@ void InitFontInfo(struct FontBitmapInfo *font_bitmap_info, int num_fonts, gfx.font_bitmap_info = font_bitmap_info; gfx.select_font_function = select_font_function; gfx.get_font_from_token_function = get_font_from_token_function; - -#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) - InitFontClipmasks(); -#endif } void FreeFontInfo(struct FontBitmapInfo *font_bitmap_info) @@ -125,10 +35,6 @@ void FreeFontInfo(struct FontBitmapInfo *font_bitmap_info) if (font_bitmap_info == NULL) return; -#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) - FreeFontClipmasks(); -#endif - free(font_bitmap_info); } @@ -195,10 +101,14 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y) int maxWordLengthInString(char *text) { char *text_ptr; - int max_word_len = 0; + int word_len = 0, max_word_len = 0; for (text_ptr = text; *text_ptr; text_ptr++) - max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0); + { + word_len = (*text_ptr != ' ' ? word_len + 1 : 0); + + max_word_len = MAX(word_len, max_word_len); + } return max_word_len; } @@ -210,8 +120,44 @@ int maxWordLengthInString(char *text) void DrawInitTextExt(char *text, int ypos, int font_nr, boolean force) { +#if 1 +#if 0 static unsigned int progress_delay = 0; unsigned int progress_delay_value = 100; /* (in milliseconds) */ +#endif + + // LimitScreenUpdates(TRUE); // (ignore "force" for now) + // LimitScreenUpdates(!force); + LimitScreenUpdates(TRUE); + + UPDATE_BUSY_STATE(); + +#if 0 + if (!force && !DelayReached(&progress_delay, progress_delay_value)) + return; +#endif + + if (window != NULL && + gfx.draw_init_text && + gfx.num_fonts > 0 && + gfx.font_bitmap_info[font_nr].bitmap != NULL) + { + 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); + + BlitBitmap(drawto, window, 0, 0, video.width, video.height, 0, 0); + } +#else + static unsigned int progress_delay = 0; + unsigned int progress_delay_value = 100; /* (in milliseconds) */ + + // LimitScreenUpdates(TRUE); // (ignore "force" for now) + LimitScreenUpdates(!force); UPDATE_BUSY_STATE(); @@ -234,9 +180,16 @@ void DrawInitTextExt(char *text, int ypos, int font_nr, boolean force) /* this makes things significantly faster than directly drawing to window */ BlitBitmap(drawto, window, 0, y, width, height, 0, y); } +#endif } void DrawInitText(char *text, int ypos, int font_nr) +{ + // DrawInitTextExt(text, ypos, font_nr, TRUE); + DrawInitTextExt(text, ypos, font_nr, FALSE); +} + +void DrawInitTextAlways(char *text, int ypos, int font_nr) { DrawInitTextExt(text, ypos, font_nr, TRUE); } @@ -314,10 +267,23 @@ void DrawText(int x, int y, char *text, int font_nr) DrawTextExt(drawto, x, y, text, font_nr, mask_mode); +#if 1 + if (IN_GFX_FIELD_FULL(x, y)) + redraw_mask |= REDRAW_FIELD; + else if (IN_GFX_DOOR_1(x, y)) + redraw_mask |= REDRAW_DOOR_1; + else if (IN_GFX_DOOR_2(x, y)) + redraw_mask |= REDRAW_DOOR_2; + else if (IN_GFX_DOOR_3(x, y)) + redraw_mask |= REDRAW_DOOR_3; + else + redraw_mask |= REDRAW_ALL; +#else if (x < gfx.dx) redraw_mask |= REDRAW_FIELD; else if (y < gfx.vy || gfx.vy == 0) redraw_mask |= REDRAW_DOOR_1; +#endif } void DrawTextExt(DrawBuffer *dst_bitmap, int dst_x, int dst_y, char *text, @@ -415,18 +381,8 @@ void DrawTextExt(DrawBuffer *dst_bitmap, int dst_x, int dst_y, char *text, font_width, font_height); } -#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) - /* use special font tile clipmasks */ - { - int font_pos = getFontCharPosition(font_nr, c); - - SetClipMask(src_bitmap, font_clip_gc, font->clip_mask[font_pos]); - SetClipOrigin(src_bitmap, font_clip_gc, dst_x, dst_y); - } -#else SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, dst_x - src_x, dst_y - src_y); -#endif BlitBitmapMasked(src_bitmap, dst_bitmap, src_x, src_y, font_width, font_height, dst_x, dst_y);