summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile1
-rw-r--r--lib/libgfx/Makefile30
-rw-r--r--lib/libgfx/include/libgfx/draw.h91
-rw-r--r--lib/libgfx/include/libgfx/gfx.h85
-rw-r--r--lib/libgfx/src/draw.c96
-rw-r--r--lib/libgfx/src/gfx.c97
6 files changed, 400 insertions, 0 deletions
diff --git a/lib/Makefile b/lib/Makefile
index a201891..4ad104b 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -6,3 +6,4 @@ ARGS = -I$(ROOT)/builddeps LDSCRIPT=$(LDSCRIPT) USRDIR=$(USRDIR) ROOT=$(ROOT)
.PHONY: all
all:
make -C libc/ $(ARGS)
+ make -C libgfx/ $(ARGS)
diff --git a/lib/libgfx/Makefile b/lib/libgfx/Makefile
new file mode 100644
index 0000000..1f866ac
--- /dev/null
+++ b/lib/libgfx/Makefile
@@ -0,0 +1,30 @@
+CFLAGS = -c -fno-stack-protector -nostdlib -static \
+ -Iinclude/ -I$(USRDIR)/include/
+CFILES = $(shell find src/ -name "*.c")
+OBJ = $(CFILES:.c=.o)
+
+all: headers $(OBJ) build/libgfx.a
+ echo "----------------------------------------"
+ echo $(USRDIR)
+ mv build/libgfx.a $(USRDIR)/lib/
+ cp -r include/ $(USRDIR)/include/
+
+build/libgfx.a:
+ mkdir -p build/
+ ar rcs build/libgfx.a $(OBJ)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -Iinclude/ $< -o $@
+
+.PHONY: headers
+headers:
+ cp -rf include/* $(USRDIR)/include/
+
+.PHONY:
+build/:
+ mkdir -p build/
+
+.PHONY: clean
+clean:
+ rm -f $(OBJ)
+ rm -rf build/
diff --git a/lib/libgfx/include/libgfx/draw.h b/lib/libgfx/include/libgfx/draw.h
new file mode 100644
index 0000000..60d2b24
--- /dev/null
+++ b/lib/libgfx/include/libgfx/draw.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Hyra nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LIBGFX_DRAW_H_
+#define _LIBGFX_DRAW_H_
+
+#include <stdint.h>
+#include <libgfx/gfx.h>
+
+/* Shape types */
+#define SHAPE_SQUARE 0x00000000
+
+/*
+ * Default shape initializer, something that
+ * works and can be tweaked. The idea of this
+ * is so that shapes may be set up like so:
+ *
+ * --
+ * struct gfx_shape blah = GFX_SHAPE_DEFAULT;
+ *
+ * blah.width = width;
+ * blah.heiht = height;
+ * ...
+ * --
+ */
+#define GFX_SHAPE_DEFAULT \
+ { \
+ .type = SHAPE_SQUARE, \
+ .color = 0x00FF00, \
+ .x = 0, \
+ .y = 0, \
+ .width = 50, \
+ .height = 50, \
+ }
+
+/*
+ * Generic shape representation
+ *
+ * @type: Shape type (see SHAPE_*)
+ * @color: Color of the shape
+ * @x: X position of the shape
+ * @y: Y position of the shape
+ * @width: Shape width
+ * @height: Shape height
+ */
+struct gfx_shape {
+ uint32_t type;
+ color_t color;
+ scrpos_t x;
+ scrpos_t y;
+ dimm_t width;
+ dimm_t height;
+};
+
+int gfx_draw_shape(struct gfx_ctx *ctx, const struct gfx_shape *shape);
+
+__always_inline static inline size_t
+gfx_io_index(struct gfx_ctx *ctx, scrpos_t x, scrpos_t y)
+{
+ struct fbattr fbdev = ctx->fbdev;
+
+ return x + y * (fbdev.pitch / 4);
+}
+
+#endif /* !_LIBGFX_DRAW_H_ */
diff --git a/lib/libgfx/include/libgfx/gfx.h b/lib/libgfx/include/libgfx/gfx.h
new file mode 100644
index 0000000..3468571
--- /dev/null
+++ b/lib/libgfx/include/libgfx/gfx.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Hyra nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LIBGFX_H_
+#define _LIBGFX_H_
+
+#include <sys/fbdev.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#define gfx_log(fmt, ...) printf( "libgfx: " fmt, ##__VA_ARGS__)
+
+/*
+ * Represents a 32-bit pixel value.
+ *
+ * 24:16 15:8 7:0
+ * +-----------------+
+ * | R | B | B |
+ * +-----------------+
+ */
+typedef uint32_t pixel_t;
+typedef pixel_t color_t;
+
+/*
+ * Basic color defines
+ */
+#define GFX_BLACK 0x000000
+#define GFX_RED 0xFF0000
+#define GFX_GREEN 0x00FF00
+#define GFX_BLUE 0x0000FF
+#define GFX_WHITE 0xFFFFFF
+#define GFX_PURPLE 0x800080
+#define GFX_YELLOW 0xFFFF00
+
+/*
+ * Represents cartesian x/y values
+ */
+typedef uint32_t cartpos_t;
+typedef cartpos_t scrpos_t;
+typedef cartpos_t dimm_t; /* Dimensions */
+
+/*
+ * Graphics context for libgfx
+ *
+ * @fbdev: Framebuffer attributes
+ * @io: Framebuffer pointer
+ * @fbfd: Framebuffer file descriptor
+ */
+struct gfx_ctx {
+ struct fbattr fbdev;
+ size_t fb_size;
+ pixel_t *io;
+ int fbfd;
+};
+
+int gfx_init(struct gfx_ctx *res);
+void gfx_cleanup(struct gfx_ctx *ctx);
+
+#endif /* !_LIBGFX_H_ */
diff --git a/lib/libgfx/src/draw.c b/lib/libgfx/src/draw.c
new file mode 100644
index 0000000..49f2f53
--- /dev/null
+++ b/lib/libgfx/src/draw.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Hyra nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/errno.h>
+#include <stdint.h>
+#include <libgfx/gfx.h>
+#include <libgfx/draw.h>
+
+/*
+ * Draw a classic square onto the screen.
+ *
+ * @ctx: Graphics context
+ * @shape: Square to draw
+ */
+static int
+gfx_draw_square(struct gfx_ctx *ctx, const struct gfx_shape *shape)
+{
+ struct fbattr fbdev;
+ off_t idx;
+ scrpos_t scr_width, scr_height;
+ scrpos_t x, y;
+
+ if (ctx == NULL || shape == NULL) {
+ return -EINVAL;
+ }
+
+ /* Grab screen dimensions */
+ fbdev = ctx->fbdev;
+ scr_width = fbdev.width;
+ scr_height = fbdev.height;
+
+ for (x = shape->x; x < shape->x + shape->width; ++x) {
+ for (y = shape->y; y < shape->y + shape->height; ++y) {
+ if (x >= scr_width || y >= scr_height) {
+ break;
+ }
+
+ idx = gfx_io_index(ctx, x, y);
+ ctx->io[idx] = shape->color;
+ }
+ }
+ return 0;
+}
+
+/*
+ * Draw a shape onto the screen
+ *
+ * @ctx: libgfx graphics context
+ * @shape: Shape to draw
+ *
+ * Returns 0 on success, otherwise a less than zero
+ * value on failure.
+ *
+ * All error codes follow POSIX errno. However if the value
+ * is -1, the requested shape to be drawn is not valid.
+ */
+int
+gfx_draw_shape(struct gfx_ctx *ctx, const struct gfx_shape *shape)
+{
+ if (ctx == NULL || shape == NULL) {
+ return -EINVAL;
+ }
+
+ switch (shape->type) {
+ case SHAPE_SQUARE:
+ return gfx_draw_square(ctx, shape);
+ }
+
+ return -1;
+}
diff --git a/lib/libgfx/src/gfx.c b/lib/libgfx/src/gfx.c
new file mode 100644
index 0000000..90dcb79
--- /dev/null
+++ b/lib/libgfx/src/gfx.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Hyra nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/errno.h>
+#include <sys/mman.h>
+#include <sys/fbdev.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <libgfx/gfx.h>
+
+/*
+ * Initialize the libgfx context
+ *
+ * @res: Context pointer to be initialized
+ */
+int
+gfx_init(struct gfx_ctx *res)
+{
+ struct fbattr attr;
+ int fd, prot;
+
+ if (res == NULL) {
+ return -EINVAL;
+ }
+
+ /* Get framebuffer attributes */
+ fd = open("/ctl/fb0/attr", O_RDONLY);
+ if (fd < 0) {
+ gfx_log("could not open '/ctl/fb0/attr");
+ return fd;
+ }
+
+ read(fd, &attr, sizeof(attr));
+ close(fd);
+ res->fbdev = attr;
+
+ /* Open the framebuffer file */
+ res->fbfd = open("/dev/fb0", O_RDWR);
+ if (res->fbfd < 0) {
+ gfx_log("could not open '/dev/fb0'\n");
+ return res->fbfd;
+ }
+
+ /* Map the framebuffer into memory */
+ prot = PROT_READ | PROT_WRITE;
+ res->fb_size = attr.height * attr.pitch;
+ res->io = mmap(NULL, res->fb_size, prot, MAP_SHARED, res->fbfd, 0);
+
+ /* Did the mmap() call work? */
+ if (res->io == NULL) {
+ gfx_log("could not map framebuffer\n");
+ close(res->fbfd);
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Cleanup all state and free the gfx
+ * context.
+ */
+void
+gfx_cleanup(struct gfx_ctx *ctx)
+{
+ if (ctx->io != NULL)
+ munmap(ctx->io, ctx->fb_size);
+ if (ctx->fbfd > 0)
+ close(ctx->fbfd);
+}