added functions for masked drawing of sized elements
[rocksndiamonds.git] / src / tools.c
index e9ee41ae18e4208676b975b1b80f984b85b24c12..bfaad2acdd577f844c51428332857eed3b0a9b30 100644 (file)
@@ -1360,6 +1360,10 @@ void SetBorderElement()
 
   BorderElement = EL_EMPTY;
 
+  /* the MM game engine does not use a visible border element */
+  if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    return;
+
   for (y = 0; y < lev_fieldy && BorderElement == EL_EMPTY; y++)
   {
     for (x = 0; x < lev_fieldx; x++)
@@ -1631,6 +1635,14 @@ void DrawSizedGraphic(int x, int y, int graphic, int frame, int tilesize)
   MarkTileDirty(x / tilesize, y / tilesize);
 }
 
+void DrawSizedGraphicThruMask(int x, int y, int graphic, int frame,
+                             int tilesize)
+{
+  DrawSizedGraphicThruMaskExt(drawto, SX + x * tilesize, SY + y * tilesize,
+                             graphic, frame, tilesize);
+  MarkTileDirty(x / tilesize, y / tilesize);
+}
+
 void DrawSizedGraphicExt(DrawBuffer *d, int x, int y, int graphic, int frame,
                         int tilesize)
 {
@@ -1641,6 +1653,16 @@ void DrawSizedGraphicExt(DrawBuffer *d, int x, int y, int graphic, int frame,
   BlitBitmap(src_bitmap, d, src_x, src_y, tilesize, tilesize, x, y);
 }
 
+void DrawSizedGraphicThruMaskExt(DrawBuffer *d, int x, int y, int graphic,
+                                int frame, int tilesize)
+{
+  Bitmap *src_bitmap;
+  int src_x, src_y;
+
+  getSizedGraphicSource(graphic, frame, tilesize, &src_bitmap, &src_x, &src_y);
+  BlitBitmapMasked(src_bitmap, d, src_x, src_y, tilesize, tilesize, x, y);
+}
+
 void DrawMiniGraphic(int x, int y, int graphic)
 {
   DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX,SY + y * MINI_TILEY, graphic);
@@ -2452,8 +2474,8 @@ void DrawLevelField(int x, int y)
   }
 }
 
-void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize,
-                     int (*el2img_function)(int))
+static void DrawSizedWallExt_MM(int dst_x, int dst_y, int element, int tilesize,
+                               int (*el2img_function)(int), boolean masked)
 {
   int element_base = map_mm_wall_element(element);
   int element_bits = (IS_DF_WALL(element) ?
@@ -2473,29 +2495,58 @@ void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize,
     int dst_draw_y = dst_y + (i / 2) * tilesize_draw;
 
     if (element_bits & (1 << i))
-      BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize_draw, tilesize_draw,
-                dst_draw_x, dst_draw_y);
+    {
+      if (masked)
+       BlitBitmapMasked(src_bitmap, drawto, src_x, src_y,
+                        tilesize_draw, tilesize_draw, dst_draw_x, dst_draw_y);
+      else
+       BlitBitmap(src_bitmap, drawto, src_x, src_y,
+                  tilesize_draw, tilesize_draw, dst_draw_x, dst_draw_y);
+    }
     else
-      ClearRectangle(drawto, dst_draw_x, dst_draw_y,
-                    tilesize_draw, tilesize_draw);
+    {
+      if (!masked)
+       ClearRectangle(drawto, dst_draw_x, dst_draw_y,
+                      tilesize_draw, tilesize_draw);
+    }
   }
 }
 
-void DrawSizedElement(int x, int y, int element, int tilesize)
+void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize,
+                     int (*el2img_function)(int))
+{
+  DrawSizedWallExt_MM(dst_x, dst_y, element, tilesize, el2img_function, FALSE);
+}
+
+void DrawSizedElementExt(int x, int y, int element, int tilesize,
+                        boolean masked)
 {
   if (IS_MM_WALL(element))
   {
-    DrawSizedWall_MM(SX + x * tilesize, SY + y * tilesize,
-                    element, tilesize, el2edimg);
+    DrawSizedWallExt_MM(SX + x * tilesize, SY + y * tilesize,
+                       element, tilesize, el2edimg, masked);
   }
   else
   {
     int graphic = el2edimg(element);
 
-    DrawSizedGraphic(x, y, graphic, 0, tilesize);
+    if (masked)
+      DrawSizedGraphicThruMask(x, y, graphic, 0, tilesize);
+    else
+      DrawSizedGraphic(x, y, graphic, 0, tilesize);
   }
 }
 
+void DrawSizedElement(int x, int y, int element, int tilesize)
+{
+  DrawSizedElementExt(x, y, element, tilesize, FALSE);
+}
+
+void DrawSizedElementThruMask(int x, int y, int element, int tilesize)
+{
+  DrawSizedElementExt(x, y, element, tilesize, TRUE);
+}
+
 void DrawMiniElement(int x, int y, int element)
 {
   int graphic;
@@ -7361,6 +7412,21 @@ int map_mm_wall_element(int element)
          element);
 }
 
+int map_mm_wall_element_editor(int element)
+{
+  switch (element)
+  {
+    case EL_MM_STEEL_WALL:     return EL_MM_STEEL_WALL_START;
+    case EL_MM_WOODEN_WALL:    return EL_MM_WOODEN_WALL_START;
+    case EL_MM_ICE_WALL:       return EL_MM_ICE_WALL_START;
+    case EL_MM_AMOEBA_WALL:    return EL_MM_AMOEBA_WALL_START;
+    case EL_DF_STEEL_WALL:     return EL_DF_STEEL_WALL_START;
+    case EL_DF_WOODEN_WALL:    return EL_DF_WOODEN_WALL_START;
+
+    default:                   return element;
+  }
+}
+
 int get_next_element(int element)
 {
   switch (element)