GC copy_clipmask_gc;
XGCValues clip_gc_values;
unsigned long clip_gc_valuemask;
-#endif
#if defined(TARGET_X11_NATIVE)
static struct
{ GFX2_SHIELD_ACTIVE, 3 },
{ -1, 0 }
};
-#endif
+#endif /* TARGET_X11_NATIVE */
+#endif /* TARGET_X11 */
int i;
To prevent this, create small (tile-sized) mask Pixmaps which will then
be set much faster with XSetClipOrigin() and speed things up a lot. */
- /* create graphic context structures needed for clipping */
- clip_gc_values.graphics_exposures = False;
- clip_gc_valuemask = GCGraphicsExposures;
- copy_clipmask_gc =
- XCreateGC(display, pix[PIX_BACK]->clip_mask,
- clip_gc_valuemask, &clip_gc_values);
-
clip_gc_values.graphics_exposures = False;
clip_gc_valuemask = GCGraphicsExposures;
tile_clip_gc =
clip_gc_values.clip_mask = pix[i]->clip_mask;
clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
pix[i]->stored_clip_gc = XCreateGC(display, window->drawable,
- clip_gc_valuemask,&clip_gc_values);
+ clip_gc_valuemask, &clip_gc_values);
}
}
#if defined(TARGET_X11_NATIVE)
+
+ /* create graphic context structures needed for clipping */
+ clip_gc_values.graphics_exposures = False;
+ clip_gc_valuemask = GCGraphicsExposures;
+ copy_clipmask_gc =
+ XCreateGC(display, pix[PIX_BACK]->clip_mask,
+ clip_gc_valuemask, &clip_gc_values);
+
/* create only those clipping Pixmaps we really need */
for(i=0; tile_needs_clipping[i].start>=0; i++)
{
src_x, src_y, TILEX, TILEY, 0, 0);
}
}
-#endif /* TARGET_X11_NATIVE */
XFreeGC(display, copy_clipmask_gc);
+#endif /* TARGET_X11_NATIVE */
+#endif /* TARGET_X11 */
+}
+
+void FreeTileClipmasks()
+{
+#if defined(TARGET_X11)
+ int i;
+
+ for(i=0; i<NUM_TILES; i++)
+ {
+ if (tile_clipmask[i] != None)
+ {
+ XFreePixmap(display, tile_clipmask[i]);
+ tile_clipmask[i] = None;
+ }
+ }
+
+ if (tile_clip_gc)
+ XFreeGC(display, tile_clip_gc);
+ tile_clip_gc = None;
+
+ for(i=0; i<NUM_BITMAPS; i++)
+ {
+ if (pix[i]->stored_clip_gc)
+ {
+ XFreeGC(display, pix[i]->stored_clip_gc);
+ pix[i]->stored_clip_gc = None;
+ }
+ }
#endif /* TARGET_X11 */
}
}
InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]);
+
InitTileClipmasks();
}
{
if (artwork.graphics_set_current != artwork.gfx_current->name)
{
- Bitmap *pix_new[NUM_PICTURES];
int i;
ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
- for(i=0; i<NUM_PICTURES; i++)
- {
- DrawInitText(image_filename[i], 150, FC_YELLOW);
- pix_new[i] = ReloadCustomImage(&pix[i], image_filename[i]);
-#if 0
- if (pix_new[i] != NULL)
- pix[i] = pix_new[i];
-#endif
- }
-
-#if 0
- InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]);
- InitTileClipmasks();
- InitGfxBackground();
-#endif
-
-#if 1
for(i=0; i<NUM_PICTURES; i++)
{
- if (pix_new[i] != NULL)
- TransferBitmapPointers(pix_new[i], pix[i]);
- }
-#else
- for(i=0; i<NUM_PICTURES; i++)
- {
- if (pix_new[i] != NULL)
- FreeBitmap(pix_old[i]);
+ DrawInitText(image_filename[i], 150, FC_YELLOW);
+ ReloadCustomImage(pix[i], image_filename[i]);
}
-#endif
-#if 1
- InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]);
+ FreeTileClipmasks();
InitTileClipmasks();
InitGfxBackground();
-#endif
SetDoorState(DOOR_OPEN_1 | DOOR_CLOSE_2);
FreeSounds(NUM_SOUNDS);
CloseAudio();
+ FreeTileClipmasks();
for(i=0; i<NUM_BITMAPS; i++)
FreeBitmap(pix[i]);
return result;
}
-void DeactivateJoystickForCalibration()
+void DeactivateJoystick()
{
/* Temporarily deactivate joystick. This is needed for calibration
screens, where the player has to select a joystick device that
joystick.status &= ~JOYSTICK_ACTIVE;
}
-void ActivateJoystickIfAvailable()
+void ActivateJoystick()
{
/* reactivate temporarily deactivated joystick */
int AnyJoystick(void);
int AnyJoystickButton(void);
-void DeactivateJoystickForCalibration();
-void ActivateJoystickIfAvailable();
+void DeactivateJoystick();
+void ActivateJoystick();
#endif /* JOYSTICK_H */
SDL_FreeSurface(bitmap->surface);
if (bitmap->surface_masked)
SDL_FreeSurface(bitmap->surface_masked);
+ bitmap->surface = NULL;
+ bitmap->surface_masked = NULL;
#else
+ /* The X11 version seems to have a memory leak here -- although
+ "XFreePixmap()" is called, the correspondig memory seems not
+ to be freed (according to "ps"). The SDL version apparently
+ does not have this problem. */
+
if (bitmap->drawable)
XFreePixmap(display, bitmap->drawable);
if (bitmap->clip_mask)
if (bitmap->stored_clip_gc)
XFreeGC(display, bitmap->stored_clip_gc);
/* the other GCs are only pointers to GCs used elsewhere */
+ bitmap->drawable = None;
+ bitmap->clip_mask = None;
+ bitmap->stored_clip_gc = None;
#endif
if (bitmap->source_filename)
free(bitmap->source_filename);
+ bitmap->source_filename = NULL;
}
-inline void TransferBitmapPointers(Bitmap *src_bitmap, Bitmap *dst_bitmap)
+inline static void TransferBitmapPointers(Bitmap *src_bitmap,
+ Bitmap *dst_bitmap)
{
if (src_bitmap == NULL || dst_bitmap == NULL)
return;
return new_bitmap;
}
-Bitmap *ReloadCustomImage(Bitmap **bitmap, char *basename)
+void ReloadCustomImage(Bitmap *bitmap, char *basename)
{
char *filename = getCustomImageFilename(basename);
- Bitmap *old_bitmap = *bitmap;
Bitmap *new_bitmap;
if (filename == NULL) /* (should never happen) */
{
Error(ERR_WARN, "ReloadCustomImage(): cannot find file '%s'", basename);
- return NULL;
+ return;
}
- if (strcmp(filename, old_bitmap->source_filename) == 0)
+ if (strcmp(filename, bitmap->source_filename) == 0)
{
/* The old and new image are the same (have the same filename and path).
This usually means that this image does not exist in this graphic set
and a fallback to the existing image is done. */
- return NULL;
+ return;
}
if ((new_bitmap = LoadImage(filename)) == NULL)
{
Error(ERR_WARN, "LoadImage() failed: %s", GetError());
- return NULL;
+ return;
}
- if (old_bitmap->width != new_bitmap->width ||
- old_bitmap->height != new_bitmap->height)
+ if (bitmap->width != new_bitmap->width ||
+ bitmap->height != new_bitmap->height)
{
Error(ERR_WARN, "ReloadCustomImage: new image has wrong dimensions");
FreeBitmap(new_bitmap);
- return NULL;
+ return;
}
-#if 0
- /* copy filename for new image */
- free(old_bitmap->source_filename);
- old_bitmap->source_filename = getStringCopy(filename);
-
- /* copy bitmap data for new image */
- BlitBitmap(new_bitmap, old_bitmap, 0,0,
- old_bitmap->width, old_bitmap->height, 0,0);
-
- FreeBitmap(new_bitmap);
-#else
- /*
- *bitmap = new_bitmap;
- */
- return new_bitmap;
-#endif
+ TransferBitmapPointers(new_bitmap, bitmap);
+ free(new_bitmap);
}
inline void InitVideoBuffer(DrawBuffer **,DrawWindow **, int,int,int, boolean);
inline Bitmap *CreateBitmapStruct(void);
inline Bitmap *CreateBitmap(int, int, int);
-inline void TransferBitmapPointers(Bitmap *, Bitmap *);
inline void FreeBitmap(Bitmap *);
inline void BlitBitmap(Bitmap *, Bitmap *, int, int, int, int, int, int);
inline void ClearRectangle(Bitmap *, int, int, int, int);
Bitmap *LoadImage(char *);
Bitmap *LoadCustomImage(char *);
-Bitmap *ReloadCustomImage(Bitmap **, char *);
+void ReloadCustomImage(Bitmap *, char *);
inline void OpenAudio(void);
inline void CloseAudio(void);
UnmapAllGadgets();
FadeSounds();
KeyboardAutoRepeatOn();
- ActivateJoystickIfAvailable();
+ ActivateJoystick();
SetDrawDeactivationMask(REDRAW_NONE);
/* needed if last screen was the playing screen, invoked from level editor */
DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN);
DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN);
+#if 0
DeactivateJoystickForCalibration();
DrawTextFCentered(SYSIZE - 20, FC_BLUE,
"Joysticks deactivated on this screen");
+#endif
HandleSetupScreen_Input(0,0, 0,0, MB_MENU_INITIALIZE);
FadeToFront();
void DrawSetupScreen()
{
+ DeactivateJoystick();
+
if (setup_mode == SETUP_MODE_INPUT)
DrawSetupScreen_Input();
else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
-#define COMPILE_DATE_STRING "[2002-04-07 18:38]"
+#define COMPILE_DATE_STRING "[2002-04-07 20:15]"