aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2022-09-06 14:23:37 +0200
committerkdx <kikoodx@paranoici.org>2022-09-06 14:23:37 +0200
commit92a6aaa7e0e30b4e75242953ae7244768cb13a38 (patch)
tree529e5d82d13e9f7870604cfc5701e65d871c8d2c
parenta85d878031755ef21dfc45637dc4130bc40f3fc7 (diff)
downloadlzr-92a6aaa7e0e30b4e75242953ae7244768cb13a38.tar.gz
draw tile
-rw-r--r--demo.c11
-rw-r--r--lzr.c32
-rw-r--r--lzr.h1
-rw-r--r--tset.bmpbin0 -> 24714 bytes
4 files changed, 38 insertions, 6 deletions
diff --git a/demo.c b/demo.c
index 0a95626..7f49fb6 100644
--- a/demo.c
+++ b/demo.c
@@ -1,18 +1,14 @@
#include "lzr.h"
#include <dx/log.h>
#include <stdbool.h>
-#include <stdlib.h>
-#include <time.h>
int main(void)
{
LZR_Config cfg = {400, 224, 60, 16, "LZR demo"};
if (LZR_Init(cfg))
return 1;
- srand(time(NULL));
- const int limit = 1 + (rand() & 15);
- for (int i = 0; i < limit; i++)
- LZR_ImageLoad("coucou.bmp");
+ LZR_ImageLoad("coucou.bmp");
+ LZR_ImageLoad("tset.bmp");
float darkness = 0.0f;
float dark_dir = 1.0f;
int x = 10;
@@ -45,6 +41,9 @@ int main(void)
LZR_DrawBegin();
LZR_DrawSetColor(0.9f, 0.9f, 0.8f);
LZR_DrawClear();
+ LZR_DrawSetColor(1.0f, 1.0f, 1.0f);
+ LZR_DrawTile(1, 2, 2, 2);
+ LZR_DrawTile(1, 4, 22, 2);
const float shade = 0.9 * (0.5f + darkness);
LZR_DrawSetColor(shade, shade, 0.0f);
LZR_DrawImageEx(0, x, y, &stg);
diff --git a/lzr.c b/lzr.c
index b2b13b4..89fe573 100644
--- a/lzr.c
+++ b/lzr.c
@@ -362,3 +362,35 @@ int LZR_DrawImageEx(int id, int x, int y, const LZR_ImageDrawSettings *stg)
}
return 0;
}
+
+int LZR_DrawTile(int id, int tile, int x, int y)
+{
+ if (id < 0) {
+ dx_log_error("id is negative");
+ return -1;
+ }
+ if (id >= LZR_MAX_IMAGES || images[id].tex == NULL) {
+ dx_log_error("no image with id %d", id);
+ return -1;
+ }
+ if (tile < 0) {
+ dx_log_error("tile is negative");
+ return -1;
+ }
+ const int img_width = images[id].width / config.tile_size;
+ const int img_height = images[id].height / config.tile_size;
+ if (tile >= img_width * img_height) {
+ dx_log_error("tile exceeds boundaries");
+ return -1;
+ }
+ SDL_Rect src;
+ src.x = (tile % img_width) * config.tile_size;
+ src.y = (tile / img_width) * config.tile_size;
+ src.w = config.tile_size, src.h = config.tile_size;
+ const SDL_Rect dst = {x, y, config.tile_size, config.tile_size};
+ if (SDL_RenderCopy(renderer, images[id].tex, &src, &dst) < 0) {
+ dx_log_error("%s", SDL_GetError());
+ return -1;
+ }
+ return 0;
+}
diff --git a/lzr.h b/lzr.h
index 01d0f74..0aea47d 100644
--- a/lzr.h
+++ b/lzr.h
@@ -55,5 +55,6 @@ int LZR_DrawLine(int x0, int y0, int x1, int y1);
int LZR_DrawRect(bool fill, int x, int y, int w, int h);
int LZR_DrawImage(int id, int x, int y);
int LZR_DrawImageEx(int id, int x, int y, const LZR_ImageDrawSettings *stg);
+int LZR_DrawTile(int id, int tile, int x, int y);
#endif
diff --git a/tset.bmp b/tset.bmp
new file mode 100644
index 0000000..28290f8
--- /dev/null
+++ b/tset.bmp
Binary files differ