/* ** bar.c for in /home/gayot_o/prog/lib/sdl-digit ** ** Made by olivier gayot ** Login ** ** Started on Mon Apr 23 08:05:18 2012 olivier gayot ** Last update Mon Apr 23 08:05:18 2012 olivier gayot */ #include "sdl_digit.h" void draw_horizontal_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { for (int j = 0; j < size / 5; ++j) { int decal = ABS((size / 5) / 2 - j); SDL_Rect begin = get_rect(rect->x + decal, rect->y + j, 0,0); SDL_Rect end = get_rect(rect->x + size - decal, rect->y + j, 0,0); draw_line(surf, begin, end, color); } } void draw_semi_horizontal_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { for (int j = 0; j < size / 5; ++j) { int decal = ABS((size / 5) / 2 - j); SDL_Rect begin = get_rect(rect->x + decal, rect->y + j, 0,0); SDL_Rect end = get_rect(rect->x + size / 2 - decal, rect->y + j, 0,0); draw_line(surf, begin, end, color); } } void draw_vertical_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { int l = size / 5; for (int i = 0; i < l; ++i) { int decal = ABS(l / 2 - i); SDL_Rect begin = get_rect(rect->x + i, rect->y + decal, 0, 0); SDL_Rect end = get_rect(rect->x + i, rect->y + size - decal, 0, 0); draw_line(surf, begin, end, color); } } void draw_semi_vertical_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { int l = size / 5; for (int i = 0; i < l; ++i) { int decal = ABS(l / 2 - i); SDL_Rect begin = get_rect(rect->x + i, rect->y + decal, 0, 0); SDL_Rect end = get_rect(rect->x + i, rect->y + size / 2 - decal, 0, 0); draw_line(surf, begin, end, color); } } void draw_diag_left_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { float l = ((float)size / 5.f); int b = l / 2; int h = size - 2 * b; int a = (int)(l / (sqrtf(2.f))); SDL_Rect begin; SDL_Rect end; for (int y = 0; y < h; ++y) { begin.x = 0; begin.y = rect->y + y; end.x = a + y; end.y = rect->y + y; if (y > a) begin.x += y - a; if (y >= h - a) end.x -= y - (h - a); begin.x += rect->x; end.x += rect->x; draw_line(surf, begin, end, color); } } void draw_diag_right_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { float l = ((float)size / 5.f); int b = l / 2; int h = size - 2 * b; int a = (int)(l / (sqrtf(2.f))); SDL_Rect begin; SDL_Rect end; for (int y = 0; y < h; ++y) { begin.x = 0; begin.y = rect->y + y; end.x = a + y; end.y = rect->y + y; if (y > a) begin.x += y - a; if (y >= h - a) end.x -= y - (h - a); begin.x = h - begin.x; end.x = h - end.x; begin.x += rect->x; end.x += rect->x; draw_line(surf, begin, end, color); } } void draw_backslash_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { float l = ((float)size / 5.f); int b = l / 2; int h = size - 2 * b; int a = (int)(l / (sqrtf(2.f))); SDL_Rect begin; SDL_Rect end; for (int y = 0; y < h; ++y) { begin.y = rect->y + y; end.y = rect->y + y; begin.x = 0; end.x = a + y / 2; if (y > a) begin.x += (y / 2) - a / 2; if (y >= h - a) end.x -= (y - (h - a)) / 2; begin.x += rect->x; end.x += rect->x; draw_line(surf, begin, end, color); } } void draw_slash_bar(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color) { float l = ((float)size / 5.f); int b = l / 2; int h = size - 2 * b; int a = (int)(l / (sqrtf(2.f))); SDL_Rect begin; SDL_Rect end; for (int y = 0; y < h; ++y) { begin.y = rect->y + y; end.y = rect->y + y; begin.x = 0; end.x = a + y / 2; if (y > a) begin.x += (y / 2) - a / 2; if (y >= h - a) end.x -= (y - (h - a)) / 2; begin.x = h / 2 - begin.x; begin.x += rect->x; end.x = h / 2 - end.x; end.x += rect->x; draw_line(surf, begin, end, color); } } /* id is : * 0 * 1 2 * 3 * 4 5 * 6 */ void draw_bar_id(SDL_Surface *surf, SDL_Rect *rect, int size, Uint32 color, int id) { SDL_Rect *rect_; switch (id) { case 0: rect_ = new_rect(rect->x + (size / 5) / 2, rect->y, 0, 0); draw_horizontal_bar(surf, rect_, size, color); break; case 1: rect_ = new_rect(rect->x, rect->y + (size / 5) / 2, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 2: rect_ = new_rect(rect->x + size, rect->y + (size / 5) / 2, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 3: rect_ = new_rect(rect->x + (size / 5) / 2, rect->y + size, 0, 0); draw_horizontal_bar(surf, rect_, size, color); break; case 4: rect_ = new_rect(rect->x, rect->y + size + (size / 5) / 2, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 5: rect_ = new_rect(rect->x + size, rect->y + size + (size / 5) / 2, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 6: rect_ = new_rect(rect->x + (size / 5) / 2, rect->y + size * 2, 0, 0); draw_horizontal_bar(surf, rect_, size, color); break; case 7: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5), 0, 0); draw_diag_right_bar(surf, rect_, size, color); break; case 8: rect_ = new_rect(rect->x + (size / 5) + size, rect->y + (size / 5), 0, 0); draw_diag_left_bar(surf, rect_, size, color); break; case 9: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5) + size, 0, 0); draw_diag_right_bar(surf, rect_, size, color); break; case 10: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5) + size, 0, 0); draw_diag_left_bar(surf, rect_, size, color); break; case 11: rect_ = new_rect(rect->x + (size / 2), rect->y + (size / 5) / 2, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 12: rect_ = new_rect(rect->x + (size / 2), rect->y + (size / 5) / 2 + size, 0, 0); draw_vertical_bar(surf, rect_, size, color); break; case 13: rect_ = new_rect(rect->x + (size / 5) / 2, rect->y + size, 0, 0); draw_semi_horizontal_bar(surf, rect_, size, color); break; case 14: rect_ = new_rect(rect->x + (size / 5) / 2 + size / 2, rect->y + size, 0, 0); draw_semi_horizontal_bar(surf, rect_, size, color); break; case 15: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5), 0, 0); draw_backslash_bar(surf, rect_, size, color); break; case 16: rect_ = new_rect(rect->x + (size / 5) + size / 2, rect->y + (size / 5), 0, 0); draw_slash_bar(surf, rect_, size, color); break; case 17: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5) + size, 0, 0); draw_slash_bar(surf, rect_, size, color); break; case 18: rect_ = new_rect(rect->x + (size / 5) + size / 2, rect->y + (size / 5) + size, 0, 0); draw_backslash_bar(surf, rect_, size, color); break; case 19: rect_ = new_rect(rect->x + (size / 5), rect->y + (size / 5) + size, 0, 0); draw_backslash_bar(surf, rect_, size, color); break; case 20: rect_ = new_rect(rect->x + (size / 5) + size / 2, rect->y + (size / 5) + size, 0, 0); draw_slash_bar(surf, rect_, size, color); break; default: return; break; } free(rect_); }