X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=29f59e295375df4880caf064ef3e918bdc9cd125;hb=38c26472a6e9f0f037ddfe535d3919c00772b26f;hp=66083aeb87d888a3a550f65ceb875a4e6bfc760d;hpb=fa26d82a378cebf6b519c566c3f33739ebba7823;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 66083aeb..29f59e29 100644 --- a/src/init.c +++ b/src/init.c @@ -215,10 +215,13 @@ static void ReinitializeGraphics() InitGraphicInfo(); /* initialize graphic info from config file */ InitFontInfo(bitmap_font_initial, - new_graphic_info[IMG_MENU_FONT_BIG].bitmap, - new_graphic_info[IMG_MENU_FONT_MEDIUM].bitmap, - new_graphic_info[IMG_MENU_FONT_SMALL].bitmap, - new_graphic_info[IMG_MENU_FONT_EM].bitmap); + new_graphic_info[IMG_FONT_BIG].bitmap, + new_graphic_info[IMG_FONT_MEDIUM].bitmap, + new_graphic_info[IMG_FONT_SMALL].bitmap, + new_graphic_info[IMG_FONT_EM].bitmap); + + SetMainBackgroundImage(IMG_BACKGROUND_DEFAULT); + SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); InitGadgets(); InitToons(); @@ -251,6 +254,7 @@ static void InitSound() static void InitTileClipmasks() { +#if 0 #if defined(TARGET_X11) XGCValues clip_gc_values; unsigned long clip_gc_valuemask; @@ -385,10 +389,12 @@ static void InitTileClipmasks() #endif /* TARGET_X11_NATIVE */ #endif /* TARGET_X11 */ +#endif } void FreeTileClipmasks() { +#if 0 #if defined(TARGET_X11) int i; @@ -417,6 +423,7 @@ void FreeTileClipmasks() #endif #endif /* TARGET_X11 */ +#endif } void InitGfx() @@ -481,7 +488,7 @@ void InitGfxBackground() fieldbuffer = bitmap_db_field; SetDrawtoField(DRAW_BACKBUFFER); - BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer, + BlitBitmap(new_graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); ClearRectangle(bitmap_db_door, 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE); @@ -686,7 +693,7 @@ void InitElementInfo() int i, act, dir; /* set values to -1 to identify later as "uninitialized" values */ - for (i=0; iwidth : TILEX) / TILEX; + int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; int *parameter = image_files[i].parameter; - new_graphic_info[i].bitmap = getBitmapFromImageID(i); + new_graphic_info[i].bitmap = src_bitmap; new_graphic_info[i].src_x = parameter[GFX_ARG_XPOS] * TILEX; new_graphic_info[i].src_y = parameter[GFX_ARG_YPOS] * TILEY; @@ -823,7 +855,15 @@ static void InitGraphicInfo() if (parameter[GFX_ARG_YOFFSET] != GFX_ARG_UNDEFINED_VALUE) new_graphic_info[i].offset_y = parameter[GFX_ARG_YOFFSET]; - new_graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES]; + /* automatically determine correct number of frames, if not defined */ + if (parameter[GFX_ARG_FRAMES] != GFX_ARG_UNDEFINED_VALUE) + new_graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES]; + else if (parameter[GFX_ARG_XPOS] == 0 && !parameter[GFX_ARG_VERTICAL]) + new_graphic_info[i].anim_frames = num_xtiles; + else if (parameter[GFX_ARG_YPOS] == 0 && parameter[GFX_ARG_VERTICAL]) + new_graphic_info[i].anim_frames = num_ytiles; + else + new_graphic_info[i].anim_frames = 1; new_graphic_info[i].anim_delay = parameter[GFX_ARG_DELAY]; if (new_graphic_info[i].anim_delay == 0) /* delay must be at least 1 */ @@ -838,7 +878,9 @@ static void InitGraphicInfo() new_graphic_info[i].anim_mode = ANIM_PINGPONG; else if (parameter[GFX_ARG_MODE_PINGPONG2]) new_graphic_info[i].anim_mode = ANIM_PINGPONG2; - else if (parameter[GFX_ARG_FRAMES] > 1) + else if (parameter[GFX_ARG_MODE_RANDOM]) + new_graphic_info[i].anim_mode = ANIM_RANDOM; + else if (new_graphic_info[i].anim_frames > 1) new_graphic_info[i].anim_mode = ANIM_LOOP; else new_graphic_info[i].anim_mode = ANIM_NONE; @@ -871,6 +913,9 @@ static void InitGraphicInfo() /* now check if no animation frames are outside of the loaded image */ + if (new_graphic_info[i].bitmap == NULL) + continue; /* skip check for optional images that are undefined */ + first_frame = 0; getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); if (src_x < 0 || src_y < 0 || @@ -901,10 +946,43 @@ static void InitGraphicInfo() getTokenFromImageID(i)); Error(ERR_RETURN, "- image file: '%s'", src_bitmap->source_filename); - Error(ERR_EXIT, "error: last animation frame out of bounds (%d,%d)", - src_x, src_y); + Error(ERR_EXIT, "error: last animation frame (%d) out of bounds (%d,%d)", + last_frame, src_x, src_y); } + +#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) + /* currently we need only a tile clip mask from the first frame */ + getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + + if (copy_clipmask_gc == None) + { + clip_gc_values.graphics_exposures = False; + clip_gc_valuemask = GCGraphicsExposures; + copy_clipmask_gc = XCreateGC(display, src_bitmap->clip_mask, + clip_gc_valuemask, &clip_gc_values); + } + + new_graphic_info[i].clip_mask = + XCreatePixmap(display, window->drawable, TILEX, TILEY, 1); + + src_pixmap = src_bitmap->clip_mask; + XCopyArea(display, src_pixmap, new_graphic_info[i].clip_mask, + copy_clipmask_gc, src_x, src_y, TILEX, TILEY, 0, 0); + + clip_gc_values.graphics_exposures = False; + clip_gc_values.clip_mask = new_graphic_info[i].clip_mask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; + new_graphic_info[i].clip_gc = + XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); +#endif } + +#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) + if (copy_clipmask_gc) + XFreeGC(display, copy_clipmask_gc); +#endif + + clipmasks_initialized = TRUE; } static void InitSoundInfo() @@ -1802,6 +1880,7 @@ void InitElementProperties() EL_SAND, EL_SP_BASE, EL_SP_BUGGY_BASE, + EL_SP_BUGGY_BASE_ACTIVATING, EL_TRAP, EL_INVISIBLE_SAND, EL_INVISIBLE_SAND_ACTIVE @@ -2114,21 +2193,21 @@ void InitElementProperties() static int num_properties1 = SIZEOF_ARRAY(ep1_num, int *); static int num_properties2 = SIZEOF_ARRAY(ep2_num, int *); - for (i=0; i