From d3153aae85f2e3cd1ba8ff0520e5ebe51e08d7d5 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 14 Aug 2011 18:31:48 +0100 Subject: [PATCH] Extended info for line drawing --- includes/defines.h | 1 + includes/graphics.h | 6 +++- src/graphics.c | 86 +++++++++++++++++++++++++++++++++++++++++++-- src/main.c | 2 +- 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/includes/defines.h b/includes/defines.h index dd36b4707..e112c71f7 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -131,6 +131,7 @@ typedef unsigned int pixel; #define DEBUG_PARTS 0x0001 #define DEBUG_PARTCOUNT 0x0002 +#define DEBUG_DRAWTOOL 0x0004 typedef unsigned char uint8; diff --git a/includes/graphics.h b/includes/graphics.h index 80dd77c18..8cd2e55e5 100644 --- a/includes/graphics.h +++ b/includes/graphics.h @@ -82,6 +82,8 @@ int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); +int drawtext_outline(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a, int or, int og, int ob, int oa); + int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a); void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); @@ -126,6 +128,8 @@ void xor_line(int x1, int y1, int x2, int y2, pixel *vid); void xor_rect(pixel *vid, int x, int y, int w, int h); +void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a); + void draw_parts(pixel *vid); void draw_walls(pixel *vid); @@ -160,7 +164,7 @@ void render_cursor(pixel *vid, int x, int y, int t, int rx, int ry); int sdl_open(void); -int draw_debug_info(pixel* vid); +int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy); #ifdef OpenGL void Enable2D (); diff --git a/src/graphics.c b/src/graphics.c index 850828882..033d2199e 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1044,6 +1044,18 @@ int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a #endif return x; } + +//Draw text with an outline +int drawtext_outline(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a, int or, int og, int ob, int oa) +{ + drawtext(vid, x-1, y-1, s, or, og, ob, oa); + drawtext(vid, x+1, y+1, s, or, og, ob, oa); + + drawtext(vid, x-1, y+1, s, or, og, ob, oa); + drawtext(vid, x+1, y-1, s, or, og, ob, oa); + + return drawtext(vid, x, y, s, r, g, b, a); +} int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a) { #ifdef OpenGL @@ -1618,6 +1630,53 @@ void xor_line(int x1, int y1, int x2, int y2, pixel *vid) } } +//same as blend_pixel, but draws a line of it +void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if (cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if (x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if (dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + e -= 1.0f; + } + } +} + //same as xor_pixel, but draws a rectangle void xor_rect(pixel *vid, int x, int y, int w, int h) { @@ -4524,11 +4583,34 @@ int sdl_open(void) return 1; } -int draw_debug_info(pixel* vid) +int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy) { + char infobuf[256]; + if(debug_flags & DEBUG_DRAWTOOL) + { + if(lm == 1) //Line tool + { + blend_line(vid, 0, cy, XRES, cy, 255, 255, 255, 120); + blend_line(vid, cx, 0, cx, YRES, 255, 255, 255, 120); + + blend_line(vid, 0, ly, XRES, ly, 255, 255, 255, 120); + blend_line(vid, lx, 0, lx, YRES, 255, 255, 255, 120); + + sprintf(infobuf, "%d x %d", lx, ly); + drawtext_outline(vid, lx+(lx>cx?3:-textwidth(infobuf)-3), ly+(lycy?-10:3), infobuf, 255, 255, 255, 200, 0, 0, 0, 120); + + sprintf(infobuf, "%d", abs(cx-lx)); + drawtext_outline(vid, cx+(lxcy?-10:3), infobuf, 255, 255, 255, 200, 0, 0, 0, 120); + + sprintf(infobuf, "%d", abs(cy-ly)); + drawtext_outline(vid, cx+(lxcy?-(cy-ly)/2:(ly-cy)/2)-3, infobuf, 255, 255, 255, 200, 0, 0, 0, 120); + } + } if(debug_flags & DEBUG_PARTS) { - char infobuf[256]; int i = 0, x = 0, y = 0, lpx = 0, lpy = 0; sprintf(infobuf, "%d/%d (%.2f%%)", parts_lastActiveIndex, NPART, (((float)parts_lastActiveIndex)/((float)NPART))*100.0f); for(i = 0; i < NPART; i++){ diff --git a/src/main.c b/src/main.c index e403b3da8..458123aa8 100644 --- a/src/main.c +++ b/src/main.c @@ -1964,7 +1964,7 @@ int main(int argc, char *argv[]) if(debug_flags) { - draw_debug_info(vid_buf); + draw_debug_info(vid_buf, lm, lx, ly, x, y); } if (http_ver_check)