WHY_CPP  0.1
drawing.cpp
1 #include <whycpp/color.h>
2 #include <whycpp/drawing.h>
3 #include <whycpp/types.h>
4 #include <algorithm>
5 #include "../context.h"
6 #include "../holders/sprites_holder.h"
7 #include "../sprite.h"
8 #include "../holders/video_memory_holder.h"
9 
10 i32 GetDisplayWidth(const Context &ctx) {
11  return ctx.Get<VideoMemoryHolder>()->GetWidth();
12 }
13 i32 GetDisplayHeight(const Context &ctx) {
14  return ctx.Get<VideoMemoryHolder>()->GetHeight();
15 }
16 void SetPixel(Context &ctx, i32 x, i32 y, const RGBA &color) {
17  if (color.alpha == 0) return;
18  ctx.Get<VideoMemoryHolder>()->Set(x, y, color);
19 }
20 const RGBA GetPixel(const Context &ctx, i32 x, i32 y) {
21  return ctx.Get<VideoMemoryHolder>()->Get(x, y);
22 }
23 void DrawClearScreen(Context &ctx, const RGBA &color) {
24  ctx.Get<VideoMemoryHolder>()->Fill(color);
25 }
26 void DrawLine(Context &ctx, i32 x0, i32 y0, i32 x1, i32 y1, const RGBA &color) {
27  i32 dx = std::abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
28  i32 dy = std::abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
29  i32 err = (dx > dy ? dx : -dy) / 2;
30  i32 e2;
31 
32  for (;;) {
33  SetPixel(ctx, x0, y0, color);
34  if (x0 == x1 && y0 == y1) break;
35  e2 = err;
36  if (e2 > -dx) {
37  err -= dy;
38  x0 += sx;
39  }
40  if (e2 < dy) {
41  err += dx;
42  y0 += sy;
43  }
44  }
45 }
46 void DrawRectFill(Context &ctx, i32 x, i32 y, i32 w, i32 h, const RGBA &color) {
47  for (auto i = y; i < y + h; i++) {
48  DrawLine(ctx, x, i, x + w - 1, i, color);
49  }
50 }
51 void DrawRect(Context &ctx, i32 x, i32 y, i32 w, i32 h, const RGBA &color) {
52  DrawLine(ctx, x, y, x + w, y, color);
53  DrawLine(ctx, x, y, x, y + h, color);
54 
55  DrawLine(ctx, x + w, y, x + w, y + h, color);
56  DrawLine(ctx, x, y + h, x + w, y + h, color);
57 }
58 void DrawCircle(Context &context, i32 x, i32 y, i32 radius, const RGBA &color) {
59  i32 r = radius;
60  i32 x_ = -r;
61  i32 y_ = 0;
62  i32 err = 2 - 2 * r;
63  do {
64  SetPixel(context, x - x_, y + y_, color);
65  SetPixel(context, x + x_, y - y_, color);
66 
67  SetPixel(context, x - y_, y - x_, color);
68  SetPixel(context, x + y_, y + x_, color);
69  r = err;
70  if (r <= y_) err += ++y_ * 2 + 1;
71  if (r > x_ || err > y_) err += ++x_ * 2 + 1;
72  } while (x_ < 0);
73 }
74 void DrawCircleFill(Context &context, i32 x, i32 y, i32 radius, const RGBA &color) {
75  i32 r = radius;
76  i32 x_ = -r;
77  i32 y_ = 0;
78  i32 err = 2 - 2 * r;
79  do {
80  for (i32 i = x + x_; i <= x - x_; i++) {
81  SetPixel(context, i, y + y_, color);
82  }
83  for (i32 i = x + x_; i <= x - x_; i++) {
84  SetPixel(context, i, y - y_, color);
85  }
86 
87  r = err;
88  if (r <= y_) err += ++y_ * 2 + 1;
89  if (r > x_ || err > y_) err += ++x_ * 2 + 1;
90  } while (x_ < 0);
91 }
92 
93 void DrawSprite(Context &context, i32 sprite_id, i32 screen_x, i32 screen_y, i32 sheet_x, i32 sheet_y, i32 width,
94  i32 height) {
95  auto spr = context.Get<SpritesHolder>()->GetSprite(sprite_id);
96  for (auto y = 0; y < height; y++) {
97  for (auto x = 0; x < width; x++) {
98  SetPixel(context, screen_x + x, screen_y + y, spr->Get(sheet_x + x, sheet_y + y));
99  }
100  }
101 }
void DrawLine(Context &ctx, i32 x0, i32 y0, i32 x1, i32 y1, const RGBA &color)
Definition: drawing.cpp:26
Definition: color.h:11
const RGBA GetPixel(const Context &ctx, i32 x, i32 y)
Definition: drawing.cpp:20
i32 GetDisplayHeight(const Context &ctx)
Definition: drawing.cpp:13
void DrawCircle(Context &context, i32 x, i32 y, i32 radius, const RGBA &color)
Definition: drawing.cpp:58
void SetPixel(Context &ctx, i32 x, i32 y, const RGBA &color)
Definition: drawing.cpp:16
void DrawClearScreen(Context &ctx, const RGBA &color)
Definition: drawing.cpp:23
void DrawCircleFill(Context &context, i32 x, i32 y, i32 radius, const RGBA &color)
Definition: drawing.cpp:74
void DrawRect(Context &ctx, i32 x, i32 y, i32 w, i32 h, const RGBA &color)
Definition: drawing.cpp:51
void DrawRectFill(Context &ctx, i32 x, i32 y, i32 w, i32 h, const RGBA &color)
Definition: drawing.cpp:46
i32 GetDisplayWidth(const Context &ctx)
Definition: drawing.cpp:10