Complete.Org: Mailing Lists: Archives: freeciv-dev: March 2004:
[Freeciv-Dev] (PR#7726) unification of draw_segment
Home

[Freeciv-Dev] (PR#7726) unification of draw_segment

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [Freeciv-Dev] (PR#7726) unification of draw_segment
From: "Jason Short" <jdorje@xxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 8 Mar 2004 23:54:12 -0800
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=7726 >

This patch moves draw_segment (and its helper functions, put_line and 
really_draw_segment) into mapview_common.

The advantages are that 200 lines of code are removed, and iso and 
non-iso support is integrated.

The disadvantage of doing it this way is that we are forced to buffer 
the drawing.  We have to draw to the canvas store, call dirty_rect, then 
let the GUI code flush the canvas.  This is slower, particularly when 
diagonal lines are drawn (and this will probably be worse for larger 
tilesets, and worse in iso view than in non-iso).  It is not really 
noticable under gui-gtk-2.0, however, because of the more efficient 
flush system.

Is this worth it?  One alternative is to draw directly to the screen, 
just as is done now.  This is generally harder and less elegant, but 
should be faster under all GUIs (unless there's a GUI that can't do it 
at all...).  There may be other ways to speed the drawing up as well - 
for instance the non-iso method is faster than the iso method (despite 
the comment to the contrary) because the rectangles we flush are smaller.

Compiled for gtk2, gtk, win32, xaw clients.  Tested under gtk and gtk2.

jason

Index: client/mapview_common.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.c,v
retrieving revision 1.87
diff -u -r1.87 mapview_common.c
--- client/mapview_common.c     8 Mar 2004 07:20:49 -0000       1.87
+++ client/mapview_common.c     9 Mar 2004 07:46:05 -0000
@@ -1392,6 +1392,119 @@
   }
 }
 
+#define ABS(x) (((x) >= 0) ? (x) : -(x))
+
+/****************************************************************************
+  Put a segment on the mapview (in iso-view only).  The segment is drawn
+  from the source tile to the adjacent tile in the given direction.
+
+  This method is faster than the one used for non-iso view, but there are
+  two drawbacks:
+  1.  Since each line spans multiple tiles, updating a single tile is
+      harder (see update_map_canvas).
+  2.  We don't know where the map wraps, so we have problems when we reach
+      the wrapping point.  On very large mapviews this means segments might
+      not be drawn near the wrapping points.
+****************************************************************************/
+static void draw_segment_iso(int src_x, int src_y, enum direction8 dir)
+{
+  int dest_x, dest_y;;
+  bool is_visible1, is_visible2;
+  int canvas_start_x, canvas_start_y;
+  int canvas_end_x, canvas_end_y;
+
+  if (!MAPSTEP(dest_x, dest_y, src_x, src_y, dir)) {
+    assert(0);
+    return;
+  }
+
+  /* Find middle of tiles. y-1 to not undraw the the middle pixel of a
+     horizontal line when we refresh the tile below-between. */
+  is_visible1
+    = map_to_canvas_pos(&canvas_start_x, &canvas_start_y, src_x, src_y);
+  is_visible2
+    = map_to_canvas_pos(&canvas_end_x, &canvas_end_y, dest_x, dest_y);
+
+  if (!is_visible1 && !is_visible2) {
+    return; /* No need to draw anything. */
+  }
+
+  canvas_start_x += NORMAL_TILE_WIDTH/2;
+  canvas_start_y += NORMAL_TILE_HEIGHT/2-1;
+  canvas_end_x += NORMAL_TILE_WIDTH/2;
+  canvas_end_y += NORMAL_TILE_HEIGHT/2-1;
+
+  /* somewhat hackish way of solving the problem where draw from a tile on
+     one side of the screen out of the screen, and the tile we draw to is
+     found to be on the other side of the screen. */
+  if (abs(canvas_end_x - canvas_start_x) > NORMAL_TILE_WIDTH
+      || abs(canvas_end_y - canvas_start_y) > NORMAL_TILE_HEIGHT)
+    return;
+
+  /* draw it! */
+  gui_put_line(mapview_canvas.store, COLOR_STD_CYAN, LINE_GOTO,
+              canvas_start_x, canvas_start_y,
+              canvas_end_x - canvas_start_x, canvas_end_y - canvas_start_y);
+  dirty_rect(MIN(canvas_start_x, canvas_end_x) - 1,
+            MIN(canvas_start_y, canvas_end_y) - 1,
+            ABS(canvas_end_x - canvas_start_x) + 2,
+            ABS(canvas_end_y - canvas_start_y) + 2);
+}
+
+/****************************************************************************
+  Put a half-segment (in non-iso view only).  The segment goes from the
+  given tile *toward* the adjacent tile in the given direction.  However
+  it only goes the the edge of the source tile.  Thus only one tile is
+  spanned (making updates of single tiles easier) but two lines must be
+  drawn to get a single segment (meaning more work & slower).
+****************************************************************************/
+static void put_line(int x, int y, enum direction8 dir)
+{
+  int canvas_src_x, canvas_src_y, canvas_dest_x, canvas_dest_y;
+
+  if (!map_to_canvas_pos(&canvas_src_x, &canvas_src_y, x, y)) {
+    return;
+  }
+  canvas_src_x += NORMAL_TILE_WIDTH/2;
+  canvas_src_y += NORMAL_TILE_HEIGHT/2;
+  DIRSTEP(canvas_dest_x, canvas_dest_y, dir);
+  canvas_dest_x = canvas_src_x + (NORMAL_TILE_WIDTH * canvas_dest_x) / 2;
+  canvas_dest_y = canvas_src_y + (NORMAL_TILE_WIDTH * canvas_dest_y) / 2;
+
+  gui_put_line(mapview_canvas.store, COLOR_STD_CYAN, LINE_GOTO,
+              canvas_src_x, canvas_src_y,
+              canvas_dest_x - canvas_src_x,
+              canvas_dest_y - canvas_src_y);
+
+  dirty_rect(MIN(canvas_src_x, canvas_dest_x) - 1,
+            MIN(canvas_src_y, canvas_dest_y) - 1,
+            ABS(canvas_dest_x - canvas_src_x) + 2,
+            ABS(canvas_dest_y - canvas_src_y) + 2);
+}
+
+/****************************************************************************
+  Draw a goto line at the given location and direction.  The line goes from
+  the source tile to the adjacent tile in the given direction.
+****************************************************************************/
+void draw_segment(int src_x, int src_y, enum direction8 dir)
+{
+  if (is_isometric) {
+    draw_segment_iso(src_x, src_y, dir);
+  } else {
+    int dest_x, dest_y, is_real;
+
+    is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
+    assert(is_real);
+
+    if (tile_visible_mapcanvas(src_x, src_y)) {
+      put_line(src_x, src_y, dir);
+    }
+    if (tile_visible_mapcanvas(dest_x, dest_y)) {
+      put_line(dest_x, dest_y, DIR_REVERSE(dir));
+    }
+  }
+}
+
 /**************************************************************************
   Remove the line from src_x, src_y in the given direction, and redraw
   the change if necessary.
Index: client/mapview_common.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.h,v
retrieving revision 1.50
diff -u -r1.50 mapview_common.h
--- client/mapview_common.h     8 Mar 2004 07:20:49 -0000       1.50
+++ client/mapview_common.h     9 Mar 2004 07:46:05 -0000
@@ -14,6 +14,7 @@
 #ifndef FC__MAPVIEW_COMMON_H
 #define FC__MAPVIEW_COMMON_H
 
+#include "map.h"
 #include "shared.h"            /* bool type */
 
 #include "colors_g.h"
@@ -188,6 +189,7 @@
 void show_city_descriptions(void);
 bool show_unit_orders(struct unit *punit);
 
+void draw_segment(int src_x, int src_y, enum direction8 dir);
 void undraw_segment(int src_x, int src_y, int dir);
 
 void decrease_unit_hp_smooth(struct unit *punit0, int hp0, 
Index: client/gui-gtk/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk/mapview.c,v
retrieving revision 1.203
diff -u -r1.203 mapview.c
--- client/gui-gtk/mapview.c    8 Mar 2004 07:20:49 -0000       1.203
+++ client/gui-gtk/mapview.c    9 Mar 2004 07:46:05 -0000
@@ -55,7 +55,6 @@
 static void pixmap_put_overlay_tile(GdkDrawable *pixmap,
                                    int canvas_x, int canvas_y,
                                    struct Sprite *ssprite);
-static void put_line(GdkDrawable *pm, int x, int y, int dir);
 
 static void pixmap_put_overlay_tile_draw(GdkDrawable *pixmap,
                                         int canvas_x, int canvas_y,
@@ -63,8 +62,6 @@
                                         int offset_x, int offset_y,
                                         int width, int height,
                                         bool fog);
-static void really_draw_segment(int src_x, int src_y, int dir,
-                               bool write_to_screen, bool force);
 static void pixmap_put_tile_iso(GdkDrawable *pm, int x, int y,
                                int canvas_x, int canvas_y,
                                int citymode,
@@ -777,6 +774,9 @@
   case LINE_TILE_FRAME:
     gc = thick_line_gc;
     break;
+  case LINE_GOTO:
+    gc = thick_line_gc;
+    break;
   }
 
   gdk_gc_set_foreground(gc, colors_standard[color]);
@@ -1007,30 +1007,6 @@
 }
 
 /**************************************************************************
-...
-**************************************************************************/
-void draw_segment(int src_x, int src_y, int dir)
-{
-  if (is_isometric) {
-    really_draw_segment(src_x, src_y, dir, TRUE, FALSE);
-  } else {
-    int dest_x, dest_y, is_real;
-
-    is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-    assert(is_real);
-
-    if (tile_visible_mapcanvas(src_x, src_y)) {
-      put_line(map_canvas_store, src_x, src_y, dir);
-      put_line(map_canvas->window, src_x, src_y, dir);
-    }
-    if (tile_visible_mapcanvas(dest_x, dest_y)) {
-      put_line(map_canvas_store, dest_x, dest_y, DIR_REVERSE(dir));
-      put_line(map_canvas->window, dest_x, dest_y, DIR_REVERSE(dir));
-    }
-  }
-}
-
-/**************************************************************************
  Area Selection
 **************************************************************************/
 void draw_selection_rectangle(int canvas_x, int canvas_y, int w, int h)
@@ -1048,26 +1024,6 @@
             canvas_x + w, canvas_y, canvas_x + w, canvas_y + h);
 
   rectangle_active = TRUE;
-}
-
-/**************************************************************************
-Not used in isometric view.
-**************************************************************************/
-static void put_line(GdkDrawable *pm, int x, int y, int dir)
-{
-  int canvas_src_x, canvas_src_y, canvas_dest_x, canvas_dest_y;
-  (void) map_to_canvas_pos(&canvas_src_x, &canvas_src_y, x, y);
-  canvas_src_x += NORMAL_TILE_WIDTH/2;
-  canvas_src_y += NORMAL_TILE_HEIGHT/2;
-  DIRSTEP(canvas_dest_x, canvas_dest_y, dir);
-  canvas_dest_x = canvas_src_x + (NORMAL_TILE_WIDTH * canvas_dest_x) / 2;
-  canvas_dest_y = canvas_src_y + (NORMAL_TILE_WIDTH * canvas_dest_y) / 2;
-
-  gdk_gc_set_foreground(civ_gc, colors_standard[COLOR_STD_CYAN]);
-
-  gdk_draw_line(pm, civ_gc,
-               canvas_src_x, canvas_src_y,
-               canvas_dest_x, canvas_dest_y);
 }
 
 /**************************************************************************
Index: client/gui-gtk-2.0/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/mapview.c,v
retrieving revision 1.103
diff -u -r1.103 mapview.c
--- client/gui-gtk-2.0/mapview.c        8 Mar 2004 07:20:49 -0000       1.103
+++ client/gui-gtk-2.0/mapview.c        9 Mar 2004 07:46:06 -0000
@@ -56,7 +56,6 @@
 static void pixmap_put_overlay_tile(GdkDrawable *pixmap,
                                    int canvas_x, int canvas_y,
                                    struct Sprite *ssprite);
-static void put_line(GdkDrawable *pm, int x, int y, int dir);
 
 static void pixmap_put_overlay_tile_draw(GdkDrawable *pixmap,
                                         int canvas_x, int canvas_y,
@@ -64,8 +63,6 @@
                                         int offset_x, int offset_y,
                                         int width, int height,
                                         bool fog);
-static void really_draw_segment(int src_x, int src_y, int dir,
-                               bool write_to_screen, bool force);
 static void pixmap_put_tile_iso(GdkDrawable *pm, int x, int y,
                                int canvas_x, int canvas_y,
                                int citymode,
@@ -847,6 +844,9 @@
   case LINE_TILE_FRAME:
     gc = thick_line_gc;
     break;
+  case LINE_GOTO:
+    gc = thick_line_gc;
+    break;
   }
 
   gdk_gc_set_foreground(gc, colors_standard[color]);
@@ -1035,82 +1035,6 @@
   set_mapview_scroll_pos(scroll_x, scroll_y);
 }
 
-  
-/**************************************************************************
-draw a line from src_x,src_y -> dest_x,dest_y on both map_canvas and
-map_canvas_store
-FIXME: We currently always draw the line.
-Only used for isometric view.
-**************************************************************************/
-static void really_draw_segment(int src_x, int src_y, int dir,
-                               bool write_to_screen, bool force)
-{
-  int dest_x, dest_y;
-  bool is_real, is_visible1, is_visible2;
-  int canvas_start_x, canvas_start_y;
-  int canvas_end_x, canvas_end_y;
-
-  gdk_gc_set_foreground(thick_line_gc, colors_standard[COLOR_STD_CYAN]);
-
-  is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-  assert(is_real);
-
-  /* Find middle of tiles. y-1 to not undraw the the middle pixel of a
-     horizontal line when we refresh the tile below-between. */
-  is_visible1
-    = map_to_canvas_pos(&canvas_start_x, &canvas_start_y, src_x, src_y);
-  is_visible2
-    = map_to_canvas_pos(&canvas_end_x, &canvas_end_y, dest_x, dest_y);
-
-  if (!is_visible1 && !is_visible2) {
-    return; /* No need to draw anything. */
-  }
-
-  canvas_start_x += NORMAL_TILE_WIDTH/2;
-  canvas_start_y += NORMAL_TILE_HEIGHT/2-1;
-  canvas_end_x += NORMAL_TILE_WIDTH/2;
-  canvas_end_y += NORMAL_TILE_HEIGHT/2-1;
-
-  /* somewhat hackish way of solving the problem where draw from a tile on
-     one side of the screen out of the screen, and the tile we draw to is
-     found to be on the other side of the screen. */
-  if (abs(canvas_end_x - canvas_start_x) > NORMAL_TILE_WIDTH
-      || abs(canvas_end_y - canvas_start_y) > NORMAL_TILE_HEIGHT)
-    return;
-
-  /* draw it! */
-  gdk_draw_line(map_canvas_store, thick_line_gc,
-               canvas_start_x, canvas_start_y, canvas_end_x, canvas_end_y);
-  if (write_to_screen)
-    gdk_draw_line(map_canvas->window, thick_line_gc,
-                 canvas_start_x, canvas_start_y, canvas_end_x, canvas_end_y);
-  return;
-}
-
-/**************************************************************************
-...
-**************************************************************************/
-void draw_segment(int src_x, int src_y, int dir)
-{
-  if (is_isometric) {
-    really_draw_segment(src_x, src_y, dir, TRUE, FALSE);
-  } else {
-    int dest_x, dest_y, is_real;
-
-    is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-    assert(is_real);
-
-    if (tile_visible_mapcanvas(src_x, src_y)) {
-      put_line(map_canvas_store, src_x, src_y, dir);
-      put_line(map_canvas->window, src_x, src_y, dir);
-    }
-    if (tile_visible_mapcanvas(dest_x, dest_y)) {
-      put_line(map_canvas_store, dest_x, dest_y, DIR_REVERSE(dir));
-      put_line(map_canvas->window, dest_x, dest_y, DIR_REVERSE(dir));
-    }
-  }
-}
-
 /**************************************************************************
  Area Selection
 **************************************************************************/
@@ -1129,26 +1053,6 @@
             canvas_x + w, canvas_y, canvas_x + w, canvas_y + h);
 
   rectangle_active = TRUE;
-}
-
-/**************************************************************************
-Not used in isometric view.
-**************************************************************************/
-static void put_line(GdkDrawable *pm, int x, int y, int dir)
-{
-  int canvas_src_x, canvas_src_y, canvas_dest_x, canvas_dest_y;
-  (void) map_to_canvas_pos(&canvas_src_x, &canvas_src_y, x, y);
-  canvas_src_x += NORMAL_TILE_WIDTH/2;
-  canvas_src_y += NORMAL_TILE_HEIGHT/2;
-  DIRSTEP(canvas_dest_x, canvas_dest_y, dir);
-  canvas_dest_x = canvas_src_x + (NORMAL_TILE_WIDTH * canvas_dest_x) / 2;
-  canvas_dest_y = canvas_src_y + (NORMAL_TILE_WIDTH * canvas_dest_y) / 2;
-
-  gdk_gc_set_foreground(civ_gc, colors_standard[COLOR_STD_CYAN]);
-
-  gdk_draw_line(pm, civ_gc,
-               canvas_src_x, canvas_src_y,
-               canvas_dest_x, canvas_dest_y);
 }
 
 /**************************************************************************
Index: client/gui-win32/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-win32/mapview.c,v
retrieving revision 1.101
diff -u -r1.101 mapview.c
--- client/gui-win32/mapview.c  9 Mar 2004 07:17:34 -0000       1.101
+++ client/gui-win32/mapview.c  9 Mar 2004 07:46:06 -0000
@@ -73,14 +73,10 @@
                                 int offset_x, int offset_y, int offset_y_unit,
                                 int width, int height, int height_unit,
                                 enum draw_type draw);
-static void really_draw_segment(HDC mapstoredc,int src_x, int src_y, int dir,
-                               bool write_to_screen, bool force);
 static void dither_tile(HDC hdc, struct Sprite **dither,
                         int canvas_x, int canvas_y,
                         int offset_x, int offset_y,
                         int width, int height, bool fog);
-static void put_line(HDC hdc, int x, int y, 
-                    int dir, bool write_to_screen);
 static void draw_rates(HDC hdc);
 
 
@@ -903,61 +899,6 @@
 }
 
 /**************************************************************************
-draw a line from src_x,src_y -> dest_x,dest_y on both map_canvas and
-map_canvas_store
-FIXME: We currently always draw the line.
-Only used for isometric view.
-**************************************************************************/
-static void really_draw_segment(HDC mapstoredc,int src_x, int src_y, int dir,
-                                bool write_to_screen, bool force)
-{
-
-  HPEN old;
-  int dest_x, dest_y, is_real;
-  int canvas_start_x, canvas_start_y;
-  int canvas_end_x, canvas_end_y;
-
-  is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-  assert(is_real);
-
-  /* Find middle of tiles. y-1 to not undraw the the middle pixel of a
-     horizontal line when we refresh the tile below-between. */
-  get_canvas_xy(src_x, src_y, &canvas_start_x, &canvas_start_y);
-  get_canvas_xy(dest_x, dest_y, &canvas_end_x, &canvas_end_y);
-  canvas_start_x += NORMAL_TILE_WIDTH/2;
-  canvas_start_y += NORMAL_TILE_HEIGHT/2-1;
-  canvas_end_x += NORMAL_TILE_WIDTH/2;
-  canvas_end_y += NORMAL_TILE_HEIGHT/2-1;
-
-  /* somewhat hackish way of solving the problem where draw from a tile on
-     one side of the screen out of the screen, and the tile we draw to is
-     found to be on the other side of the screen. */
-  if (abs(canvas_end_x - canvas_start_x) > NORMAL_TILE_WIDTH
-      || abs(canvas_end_y - canvas_start_y) > NORMAL_TILE_HEIGHT)
-    return;
-  
-  old=SelectObject(mapstoredc, pen_std[COLOR_STD_CYAN]);
-  /* draw it! */
-  MoveToEx(mapstoredc,canvas_start_x,canvas_start_y,NULL);
-  LineTo(mapstoredc,canvas_end_x,canvas_end_y);
-  SelectObject(mapstoredc,old);
-  if (write_to_screen) {
-    HDC hdc;
-    hdc=GetDC(map_window);
-    
-    old=SelectObject(hdc, pen_std[COLOR_STD_CYAN]);
-    
-    MoveToEx(hdc,canvas_start_x,canvas_start_y,NULL);
-    LineTo(hdc,canvas_end_x,canvas_end_y);
-    SelectObject(hdc,old);
-    ReleaseDC(map_window,hdc);
-  }
-  return;
-}
-
-
-
-/**************************************************************************
 Only used for isometric view.
 **************************************************************************/
 static void pixmap_put_overlay_tile_draw(HDC hdc,
@@ -1116,6 +1057,7 @@
     hdc = GetDC(root_window);
   }
 
+  /* FIXME: set line type (size). */
   old_pen = SelectObject(hdc, pen_std[color]);
   MoveToEx(hdc, start_x, start_y, NULL);
   LineTo(hdc, start_x + dx, start_y + dy);
@@ -1366,73 +1308,6 @@
                                  offset_x, offset_y_unit,
                                  width, height_unit, fog);
   
-}
-
-
-
-/**************************************************************************
-Not used in isometric view.
-**************************************************************************/
-static void put_line(HDC hdc, int x, int y, 
-                    int dir, bool write_to_screen)
-{
-  HPEN old;
-  int canvas_src_x, canvas_src_y, canvas_dest_x, canvas_dest_y;
-  get_canvas_xy(x, y, &canvas_src_x, &canvas_src_y);
-  canvas_src_x += NORMAL_TILE_WIDTH/2;
-  canvas_src_y += NORMAL_TILE_HEIGHT/2;
-  DIRSTEP(canvas_dest_x, canvas_dest_y, dir);
-  canvas_dest_x = canvas_src_x + (NORMAL_TILE_WIDTH * canvas_dest_x) / 2;
-  canvas_dest_y = canvas_src_y + (NORMAL_TILE_WIDTH * canvas_dest_y) / 2;
- 
-  old=SelectObject(hdc,pen_std[COLOR_STD_CYAN]);
-  MoveToEx(hdc,canvas_src_x,
-          canvas_src_y,
-          NULL);
-  LineTo(hdc,canvas_dest_x,
-        canvas_dest_y);
-  SelectObject(hdc,old);
-}
-
-
-/**************************************************************************
-...
-**************************************************************************/
-void draw_segment(int src_x, int src_y, int dir)
-{
-  HDC hdc;
-
-  assert(get_drawn(src_x, src_y, dir) > 0);
-
-  if (is_isometric) {
-    HDC mapstoredc = CreateCompatibleDC(NULL);
-    HBITMAP old = SelectObject(mapstoredc, mapstorebitmap);
-
-    really_draw_segment(mapstoredc, src_x, src_y, dir, TRUE, FALSE);
-    SelectObject(mapstoredc, old);
-    DeleteDC(mapstoredc);
-  } else {
-    int dest_x, dest_y, is_real;
-    HBITMAP old;
-    HDC mapstoredc;
-    is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-    assert(is_real);
-
-    mapstoredc=CreateCompatibleDC(NULL);
-    old=SelectObject(mapstoredc,mapstorebitmap);
-    hdc=GetDC(map_window);
-    if (tile_visible_mapcanvas(src_x, src_y)) {
-      put_line(mapstoredc, src_x, src_y, dir,0);
-      put_line(hdc, src_x, src_y, dir,1);
-    }
-    if (tile_visible_mapcanvas(dest_x, dest_y)) {
-      put_line(mapstoredc, dest_x, dest_y, DIR_REVERSE(dir),0);
-      put_line(hdc, dest_x, dest_y, DIR_REVERSE(dir),1);
-    }
-    ReleaseDC(map_window,hdc);
-    SelectObject(mapstoredc,old);
-    DeleteDC(mapstoredc);
-  }
 }
 
 /**************************************************************************
Index: client/gui-xaw/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/mapview.c,v
retrieving revision 1.166
diff -u -r1.166 mapview.c
--- client/gui-xaw/mapview.c    8 Mar 2004 07:20:50 -0000       1.166
+++ client/gui-xaw/mapview.c    9 Mar 2004 07:46:06 -0000
@@ -56,7 +56,6 @@
 
 static void pixmap_put_overlay_tile(Pixmap pixmap, int x, int y,
                                    struct Sprite *ssprite);
-static void put_line(Pixmap pm, int x, int y, int dir);
 
 /* the intro picture is held in this pixmap, which is scaled to
    the screen size */
@@ -493,9 +492,22 @@
                  enum line_type ltype, int start_x, int start_y,
                  int dx, int dy)
 {
-  GC gc;
+  GC gc = NULL;
+
+  switch (ltype) {
+  case LINE_NORMAL:
+    gc = civ_gc;
+    break;
+  case LINE_BORDER:
+    gc = border_line_gc;
+    break;
+  case LINE_TILE_FRAME:
+  case LINE_GOTO:
+    /* TODO: differentiate these. */
+    gc = civ_gc;
+    break;
+  }
 
-  gc = (ltype == LINE_BORDER ? border_line_gc : civ_gc);
   XSetForeground(display, gc, colors_standard[color]);
   XDrawLine(display, pcanvas->pixmap, gc,
            start_x, start_y, start_x + dx, start_y + dy);
@@ -874,45 +886,6 @@
 
   set_mapview_scroll_pos(scroll_x, scroll_y);
   update_map_canvas_scrollbars();
-}
-
-/**************************************************************************
-...
-**************************************************************************/
-static void put_line(Pixmap pm, int x, int y, int dir)
-{
-  int canvas_src_x, canvas_src_y, canvas_dest_x, canvas_dest_y;
-  (void) map_to_canvas_pos(&canvas_src_x, &canvas_src_y, x, y);
-  canvas_src_x += NORMAL_TILE_WIDTH/2;
-  canvas_src_y += NORMAL_TILE_HEIGHT/2;
-  canvas_dest_x = canvas_src_x + (NORMAL_TILE_WIDTH * DIR_DX[dir])/2;
-  canvas_dest_y = canvas_src_y + (NORMAL_TILE_WIDTH * DIR_DY[dir])/2;
-
-  XSetForeground(display, civ_gc, colors_standard[COLOR_STD_CYAN]);
-
-  XDrawLine(display, pm, civ_gc, canvas_src_x, canvas_src_y,
-           canvas_dest_x, canvas_dest_y);
-}
-
-/**************************************************************************
-...
-**************************************************************************/
-void draw_segment(int src_x, int src_y, int dir)
-{
-  int dest_x, dest_y, is_real;
-
-  is_real = MAPSTEP(dest_x, dest_y, src_x, src_y, dir);
-  assert(is_real);
-
-  if (tile_visible_mapcanvas(src_x, src_y)) {
-    put_line(map_canvas_store, src_x, src_y, dir);
-    put_line(XtWindow(map_canvas), src_x, src_y, dir);
-  }
-
-  if (tile_visible_mapcanvas(dest_x, dest_y)) {
-    put_line(map_canvas_store, dest_x, dest_y, DIR_REVERSE(dir));
-    put_line(XtWindow(map_canvas), dest_x, dest_y, DIR_REVERSE(dir));
-  }
 }
 
 /**************************************************************************
Index: client/include/colors_g.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/include/colors_g.h,v
retrieving revision 1.8
diff -u -r1.8 colors_g.h
--- client/include/colors_g.h   27 Feb 2004 16:30:33 -0000      1.8
+++ client/include/colors_g.h   9 Mar 2004 07:46:06 -0000
@@ -28,7 +28,7 @@
 };
 
 enum line_type {
-  LINE_NORMAL, LINE_BORDER, LINE_TILE_FRAME
+  LINE_NORMAL, LINE_BORDER, LINE_TILE_FRAME, LINE_GOTO
 };
 
 enum Display_color_type {
Index: client/include/mapview_g.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/include/mapview_g.h,v
retrieving revision 1.48
diff -u -r1.48 mapview_g.h
--- client/include/mapview_g.h  8 Mar 2004 07:20:50 -0000       1.48
+++ client/include/mapview_g.h  9 Mar 2004 07:46:06 -0000
@@ -79,7 +79,6 @@
                               int old_canvas_x, int old_canvas_y,
                               int new_canvas_x, int new_canvas_y);
 
-void draw_segment(int src_x, int src_y, int dir);
 void draw_selection_rectangle(int canvas_x, int canvas_y, int w, int h);
 void tileset_changed(void);
 

[Prev in Thread] Current Thread [Next in Thread]