graphics.cxx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "graphics.h"
  2. #define SCALE 10
  3. /*
  4. Fontname: micro
  5. Copyright: Public domain font. Share and enjoy.
  6. Glyphs: 18/128
  7. BBX Build Mode: 0
  8. */
  9. const uint8_t u8g2_font_micro_tn[148] =
  10. "\22\0\2\3\2\3\1\4\4\3\5\0\0\5\0\5\0\0\0\0\0\0w \4`\63*\10\67\62Q"
  11. "j\312\0+\7or\321\24\1,\5*r\3-\5\247\62\3.\5*\62\4/\10\67\262\251\60\12"
  12. "\1\60\10\67r)U\12\0\61\6\66rS\6\62\7\67\62r\224\34\63\7\67\62r$\22\64\7\67"
  13. "\62\221\212\14\65\7\67\62\244<\1\66\6\67r#E\67\10\67\62c*\214\0\70\6\67\62TE\71"
  14. "\7\67\62\24\71\1:\6\66\62$\1\0\0\0\4\377\377\0";
  15. // TODO: allow points to be located outside the canvas. currently, the canvas_* methods
  16. // choke on this in some cases, resulting in large vertical/horizontal lines
  17. void gfx_draw_line(Canvas* canvas, float x1, float y1, float x2, float y2) {
  18. canvas_draw_line(
  19. canvas, roundf(x1 / SCALE), roundf(y1 / SCALE), roundf(x2 / SCALE), roundf(y2 / SCALE));
  20. }
  21. void gfx_draw_line(Canvas* canvas, const Vec2& p1, const Vec2& p2) {
  22. gfx_draw_line(canvas, p1.x, p1.y, p2.x, p2.y);
  23. }
  24. void gfx_draw_disc(Canvas* canvas, float x, float y, float r) {
  25. canvas_draw_disc(canvas, roundf(x / SCALE), roundf(y / SCALE), roundf(r / SCALE));
  26. }
  27. void gfx_draw_disc(Canvas* canvas, const Vec2& p, float r) {
  28. gfx_draw_disc(canvas, p.x, p.y, r);
  29. }
  30. void gfx_draw_circle(Canvas* canvas, float x, float y, float r) {
  31. canvas_draw_circle(canvas, roundf(x / SCALE), roundf(y / SCALE), roundf(r / SCALE));
  32. }
  33. void gfx_draw_circle(Canvas* canvas, const Vec2& p, float r) {
  34. gfx_draw_circle(canvas, p.x, p.y, r);
  35. }
  36. void gfx_draw_dot(Canvas* canvas, float x, float y) {
  37. canvas_draw_dot(canvas, roundf(x / SCALE), roundf(y / SCALE));
  38. }
  39. void gfx_draw_dot(Canvas* canvas, const Vec2& p) {
  40. gfx_draw_dot(canvas, p.x, p.y);
  41. }
  42. void gfx_draw_arc(Canvas* canvas, const Vec2& p, float r, float start, float end) {
  43. float adj_end = end;
  44. if(end < start) {
  45. adj_end += (float)M_PI * 2;
  46. }
  47. // initialize to start of arc
  48. float sx = p.x + r * cosf(start);
  49. float sy = p.y - r * sinf(start);
  50. size_t segments = r / 8;
  51. for(size_t i = 1; i <= segments; i++) { // for now, use r to determin number of segments
  52. float nx = p.x + r * cosf(start + i / (segments / (adj_end - start)));
  53. float ny = p.y - r * sinf(start + i / (segments / (adj_end - start)));
  54. gfx_draw_line(canvas, sx, sy, nx, ny);
  55. sx = nx;
  56. sy = ny;
  57. }
  58. }
  59. void gfx_draw_str(Canvas* canvas, int x, int y, Align h, Align v, const char* str) {
  60. canvas_set_custom_u8g2_font(canvas, u8g2_font_micro_tn);
  61. canvas_set_color(canvas, ColorWhite);
  62. int w = canvas_string_width(canvas, str);
  63. if(h == AlignRight) {
  64. canvas_draw_box(canvas, x - 1 - w, y, w + 2, 6);
  65. } else if(h == AlignLeft) {
  66. canvas_draw_box(canvas, x - 1, y, w + 2, 6);
  67. }
  68. canvas_set_color(canvas, ColorBlack);
  69. canvas_draw_str_aligned(canvas, x, y, h, v, str);
  70. canvas_set_font(canvas, FontSecondary); // reset?
  71. }