aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2005-04-27 20:29:19 +0000
committerMax Horn2005-04-27 20:29:19 +0000
commit4ec716103270459a978fe1e6c699db5bfd5ae6cc (patch)
tree1cce871512dd281dfa90c8b160b9e5bf5a60d8a1
parent6fb944befd6e7bc089d4e7cc309ee1f6e8d89dc7 (diff)
downloadscummvm-rg350-4ec716103270459a978fe1e6c699db5bfd5ae6cc.tar.gz
scummvm-rg350-4ec716103270459a978fe1e6c699db5bfd5ae6cc.tar.bz2
scummvm-rg350-4ec716103270459a978fe1e6c699db5bfd5ae6cc.zip
Patch #1186744 (Common line-drawing function)
svn-id: r17842
-rw-r--r--graphics/primitives.cpp64
-rw-r--r--graphics/primitives.h30
-rw-r--r--sword2/build_display.h1
-rw-r--r--sword2/driver/render.cpp45
4 files changed, 97 insertions, 43 deletions
diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp
new file mode 100644
index 0000000000..f5c28a0cfd
--- /dev/null
+++ b/graphics/primitives.cpp
@@ -0,0 +1,64 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2005 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ */
+
+#include "common/stdafx.h"
+#include "common/util.h"
+
+namespace Graphics {
+
+void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data) {
+ // Bresenham's line algorithm, as described by Wikipedia
+ bool steep = ABS(y1 - y0) > ABS(x1 - x0);
+
+ if (steep) {
+ SWAP(x0, y0);
+ SWAP(x1, y1);
+ }
+
+ int delta_x = ABS(x1 - x0);
+ int delta_y = ABS(y1 - y0);
+ int err = 0;
+ int delta_err = delta_y;
+ int x = x0;
+ int y = y0;
+
+ int x_step = (x0 < x1) ? 1 : -1;
+ int y_step = (y0 < y1) ? 1 : -1;
+
+ if (steep)
+ (*plotProc)(y, x, color, data);
+ else
+ (*plotProc)(x, y, color, data);
+
+ while (x != x1) {
+ x += x_step;
+ err += delta_err;
+ if (2 * err > delta_x) {
+ y += y_step;
+ err -= delta_x;
+ }
+ if (steep)
+ (*plotProc)(y, x, color, data);
+ else
+ (*plotProc)(x, y, color, data);
+ }
+}
+
+} // End of namespace Graphics
diff --git a/graphics/primitives.h b/graphics/primitives.h
new file mode 100644
index 0000000000..d00c68840e
--- /dev/null
+++ b/graphics/primitives.h
@@ -0,0 +1,30 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2005 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ */
+
+#ifndef GRAPHICS_PRIMITIVES_H
+#define GRAPHICS_PRIMITIVES_H
+
+namespace Graphics {
+
+extern void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data);
+
+} // End of namespace Graphics
+
+#endif
diff --git a/sword2/build_display.h b/sword2/build_display.h
index 11b25e6694..76853bcf7e 100644
--- a/sword2/build_display.h
+++ b/sword2/build_display.h
@@ -417,7 +417,6 @@ public:
void plotPoint(int x, int y, uint8 colour);
void drawLine(int x0, int y0, int x1, int y1, uint8 colour);
- void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data);
#ifdef BACKEND_8BIT
void plotYUV(byte *lut, int width, int height, byte *const *dat);
diff --git a/sword2/driver/render.cpp b/sword2/driver/render.cpp
index 0cb20b0291..f2030a295f 100644
--- a/sword2/driver/render.cpp
+++ b/sword2/driver/render.cpp
@@ -21,6 +21,8 @@
#include "common/stdafx.h"
#include "common/system.h"
+#include "graphics/primitives.h"
+
#include "sword2/sword2.h"
#include "sword2/defs.h"
#include "sword2/build_display.h"
@@ -225,48 +227,7 @@ static void plot(int x, int y, int colour, void *data) {
*/
void Screen::drawLine(int x0, int y0, int x1, int y1, uint8 colour) {
- drawLine(x0, y0, x1, y1, colour, &plot, this);
-}
-
-// TODO: Main line-drawing function. Move this somewhere where other engines
-// can benefit from it.
-
-void Screen::drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data) {
- // Bresenham's line algorithm, as described by Wikipedia
- bool steep = ABS(y1 - y0) > ABS(x1 - x0);
-
- if (steep) {
- SWAP(x0, y0);
- SWAP(x1, y1);
- }
-
- int delta_x = ABS(x1 - x0);
- int delta_y = ABS(y1 - y0);
- int err = 0;
- int delta_err = delta_y;
- int x = x0;
- int y = y0;
-
- int x_step = (x0 < x1) ? 1 : -1;
- int y_step = (y0 < y1) ? 1 : -1;
-
- if (steep)
- (*plotProc)(y, x, color, data);
- else
- (*plotProc)(x, y, color, data);
-
- while (x != x1) {
- x += x_step;
- err += delta_err;
- if (2 * err > delta_x) {
- y += y_step;
- err -= delta_x;
- }
- if (steep)
- (*plotProc)(y, x, color, data);
- else
- (*plotProc)(x, y, color, data);
- }
+ Graphics::drawLine(x0, y0, x1, y1, colour, &plot, this);
}
/**