about summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <sternenseemann@systemli.org>2022-05-03 11:37:59 +0200
committersternenseemann <sternenseemann@systemli.org>2022-05-03 11:37:59 +0200
commit1cb24aba97c9116c2953dfc184c25e2c305c932f (patch)
tree05671e25f35e9d7bca7c39c4a7d6420787cca317
parentf0d5f6954fb53f7db1342ff172e1b21671d05e6c (diff)
refactor: merge headers into one haskell-bindings
buchstabensuppe.h already included bitmap.h, flipdot.h was the only
independent one. Since it is relatively simple and contains generally
useful view manipulation routines, we can merge it into the main one as
well.
-rw-r--r--bitmap.c2
-rw-r--r--bs-renderflipdot.c1
-rw-r--r--flipdot.c2
-rw-r--r--include/buchstabensuppe.h250
-rw-r--r--include/buchstabensuppe/bitmap.h179
-rw-r--r--include/buchstabensuppe/flipdot.h84
-rw-r--r--meson.build5
7 files changed, 248 insertions, 275 deletions
diff --git a/bitmap.c b/bitmap.c
index 837143b..43328b5 100644
--- a/bitmap.c
+++ b/bitmap.c
@@ -4,7 +4,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <buchstabensuppe/bitmap.h>
+#include <buchstabensuppe.h>
 
 bool bs_bitmap_extend(bs_bitmap_t *b, int new_w, int new_h, unsigned char init) {
   int diff_x = fmax(new_w - b->bs_bitmap_width, 0);
diff --git a/bs-renderflipdot.c b/bs-renderflipdot.c
index edfe60a..01f196a 100644
--- a/bs-renderflipdot.c
+++ b/bs-renderflipdot.c
@@ -10,7 +10,6 @@
 #include <unistd.h>
 
 #include <buchstabensuppe.h>
-#include <buchstabensuppe/flipdot.h>
 
 #define DEFAULT_FONT_SIZE 16
 #define DEFAULT_FLIPDOT_WIDTH 80
diff --git a/flipdot.c b/flipdot.c
index 7a6d557..b865d19 100644
--- a/flipdot.c
+++ b/flipdot.c
@@ -1,7 +1,7 @@
 #include <errno.h>
 #include <stdlib.h>
 
-#include <buchstabensuppe/flipdot.h>
+#include <buchstabensuppe.h>
 
 bool bs_scroll_next_view(bs_view_t *view, int step, enum bs_dimension dim) {
   if(step == 0) {
diff --git a/include/buchstabensuppe.h b/include/buchstabensuppe.h
index 461d96f..d1f8a62 100644
--- a/include/buchstabensuppe.h
+++ b/include/buchstabensuppe.h
@@ -4,12 +4,10 @@
 #ifndef BUCHSTABENSUPPE_H
 #define BUCHSTABENSUPPE_H
 
-#include <buchstabensuppe/bitmap.h>
-
 #include <stdbool.h>
 #include <stddef.h>
-
-// buffers
+#include <stdint.h>
+#include <sys/socket.h>  /* sockaddr */
 
 /*!
  * @name UTF-32 Buffer API
@@ -34,6 +32,250 @@ bs_utf32_buffer_t bs_decode_utf8(const char *, size_t);
 //! @}
 
 /*!
+ * @name Grayscale Bitmap API
+ * @{
+ */
+
+/*!
+ * @brief 8-bit bitmap
+ *
+ * bs_bitmap_t wraps a `unsigned char` buffer
+ * representing a bitmap of a certain width
+ * and height. The pixels are written into
+ * the buffer row by row. This means the
+ * index of a pixel is computed like this:
+ * `y * width + x`.
+ */
+typedef struct bs_bitmap {
+  unsigned char *bs_bitmap;         //!< Dynamically allocated bitmap buffer
+
+  int            bs_bitmap_height;  //!< Height of the bitmap
+  int            bs_bitmap_width;   //!< Width of the bitmap
+  // TODO make unsigned
+} bs_bitmap_t;
+
+/*!
+ * @brief Create a new bitmap
+ *
+ * Creates a new bitmap with the given width and height.
+ * The allocated bitmap is then initialized to hold the
+ * value `initial` for every pixel.
+ *
+ * The caller is responsible for freeing the returned bitmap.
+ */
+bs_bitmap_t bs_bitmap_new(int width, int height, unsigned char inital);
+
+/*!
+ * @brief Free a bitmap's buffer
+ *
+ * Frees the buffer allocated for the given bitmap and
+ * updates its dimensions to zero width and height, so
+ * future operations won't crash. Note that this does
+ * _not_ free the bitmap structure itself as it is not
+ * intended to be dynamically allocated.
+ */
+void bs_bitmap_free(bs_bitmap_t *bitmap);
+
+/*!
+ * @brief Increase the size of a bitmap
+ *
+ * Resizes the bitmap to a new size, but will only increase
+ * its size. The newly allocated space is then intialized
+ * with the given value.
+ */
+bool bs_bitmap_extend(bs_bitmap_t *bitmap, int new_width,
+  int new_height, unsigned char initial_value);
+
+/*!
+ * @brief Set a pixel value
+ *
+ * Sets the pixel at the specified location to the given value
+ * or does nothing if the location is out of bounds.
+ */
+void bs_bitmap_set(bs_bitmap_t bitmap, int x, int y, unsigned char value);
+
+/*!
+ * @brief Get a pixel value
+ *
+ * Gets the value at the specified location. If the location
+ * is out of bounds it returns `def` and sets `errno` to `EINVAL`.
+ */
+unsigned char bs_bitmap_get(bs_bitmap_t bitmap, int x, int y, unsigned char def);
+
+/*!
+ * @brief Copy a bitmap into another one
+ *
+ * Copies the source bitmap into the destination one with the
+ * given offset. Any overflow is cut off, offsets may be
+ * negative as well.
+ */
+void bs_bitmap_copy(bs_bitmap_t destination, int offset_x,
+  int offset_y, bs_bitmap_t source);
+
+/*!
+ * @brief Print a representation of a bitmap to stdout
+ *
+ * Uses the unicode block character to render a representation
+ * of the bitmap. If `binary_image` is false, the image is
+ * considered as a grayscale image and all values greater than
+ * 0x80 are rendered as “white” pixels, all below as “black”
+ * pixels. Else 1 is “white”, 0 is “black”.
+ */
+void bs_bitmap_print(bs_bitmap_t bitmap, bool binary_image);
+
+/*!
+ * @brief Map a bitmap
+ *
+ * Calls the provided function on every pixel of the bitmap
+ * and sets it to the returned value.
+ */
+void bs_bitmap_map(bs_bitmap_t bitmap, unsigned char (*fun)(unsigned char));
+
+/*!
+ * @brief Invert a binary pixel
+ *
+ * To be used with bs_bitmap_map().
+ */
+unsigned char bs_pixel_invert_binary(unsigned char);
+
+/*!
+ * @brief Invert a grayscale pixel
+ *
+ * To be used with bs_bitmap_map().
+ */
+unsigned char bs_pixel_invert_grayscale(unsigned char);
+
+/*!
+ * @brief Convert a grayscale pixel to binary
+ *
+ * To be used with bs_bitmap_map().
+ */
+unsigned char bs_pixel_to_binary(unsigned char);
+
+/*!
+ * @brief convert a binary pixel to grayscale
+ *
+ * To be used with bs_bitmap_map().
+ */
+unsigned char bs_pixel_to_grayscale(unsigned char);
+
+//! @}
+
+/*!
+ * @name Bitmap Views
+ * @{
+ */
+
+/*!
+ * @brief Bitmap subset
+ *
+ * A view represents a cropped bitmap in
+ * a cheap manner similar to a string slice.
+ */
+typedef struct bs_bm_view {
+  bs_bitmap_t  bs_view_bitmap;
+  int bs_view_offset_x;
+  int bs_view_offset_y;
+  int bs_view_width;
+  int bs_view_height;
+} bs_view_t;
+
+/*
+ * @brief Compact a binary bitmap
+ *
+ * This converts a binary bitmap into a more compact
+ * representation which every byte stores 8 pixels
+ * instead of just 1. The highest bit represents the
+ * pixel that comes first in the bitmap.
+ *
+ * The resulting format is precisely what the
+ * [Flidpot UDP protocol](https://wiki.openlab-augsburg.de/Flipdots#per-udp-schnittstelle)
+ * requires.
+ *
+ * `view` describes the bitmap to be used and the area
+ * of it. `size` will hold the length of the returned array.
+ *
+ * If the `view` contains areas which are not covered by its
+ * bitmap, these pixels are treated as if they had the value
+ * `def`.
+ *
+ * On error `NULL` is returned and `size` is 0. The allocated
+ * memory must be freed by the caller.
+ */
+uint8_t *bs_view_bitarray(bs_view_t view, size_t *size, unsigned char def);
+
+/*!
+ * @brief Axis description
+ *
+ * Describes which direction to perform a movement in for
+ * bs_scroll_next_view() and bs_page_next_view().
+ */
+enum bs_dimension {
+  BS_DIMENSION_X,    //!< X Axis
+  BS_DIMENSION_Y,    //!< Y Axis
+};
+
+/*!
+ * @brief Calculates next view for a one dimensional scroll through a bitmap.
+ *
+ * Advance a bitmap view by `step` in a given dimension. Will return `true`
+ * as soon as the bitmap is out of view and wrap around, i. e. sets the offset
+ * to `-len`. This is intended to provide the view for the next frame to be
+ * rendered to a (flipdot) display.
+ *
+ * The given view is expected to be fully intialized and `bs_view_width` and
+ * `bs_view_height` to be equal to the dimensions of the target screen. Also
+ * the first view position must be set by the caller.
+ *
+ * @param view bitmap view to alter
+ * @param step step to advance by
+ * @param dim  dimension to advance in
+ *
+ * @return true if the bitmap has come out of view,
+ *         i. e. the scrolling motion is finished
+ */
+bool bs_scroll_next_view(bs_view_t *view, int step, enum bs_dimension dim);
+
+/*!
+ * @brief Calculates next view for one dimensional paging through a bitmap.
+ *
+ * This is similar to bs_scroll_next_view(), but the scroll step is the target
+ * display's width or height and the picture is never scrolled out of view.
+ *
+ * If the edge of the bitmap is in view, true is returned and the offset is
+ * set so the first page is in view.
+ *
+ * @param view bitmap view to alter
+ * @param step step to advance by
+ * @param dim  dimension to advance in
+ *
+ * @return true if another page would mean the bitmap would come out of view
+ *         i. e. all pages have been viewed
+ */
+bool bs_page_next_view(bs_view_t *view, int direction, enum bs_dimension dim);
+
+/*!
+ * @brief Render a bitmap view onto a flipdot display
+ *
+ * This function renders a view to a flipdot display compatible bitarray
+ * using bs_view_bitmap() and sends it to a display listening at the given
+ * address using a given socket.
+ *
+ * The viewed bitmap must be a binary bitmap for this to work properly.
+ * Zero is black, all values greater than zero are white.
+ *
+ * @param sockfd          file descriptor of a `SOCK_DGRAM` socket
+ * @param addr            address of the target flipdot display
+ * @param addrlen         length of the address structure
+ * @param view            bitmap view to render
+ * @param overflow_color  value area outside of the picture should get (either 0 or 1)
+ */
+int bs_flipdot_render(int sockfd, struct sockaddr *addr, socklen_t addrlen,
+  bs_view_t view, unsigned char overflow_color);
+
+//! @}
+
+/*!
  * @name Font Rendering
  * @{
  */
diff --git a/include/buchstabensuppe/bitmap.h b/include/buchstabensuppe/bitmap.h
deleted file mode 100644
index c6a47e1..0000000
--- a/include/buchstabensuppe/bitmap.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*!
- * @file buchstabensuppe/bitmap.h
- */
-// TODO: show correct header path in doxygen
-#ifndef BUCHSTABENSUPPE_BITMAP_H
-#define BUCHSTABENSUPPE_BITMAP_H
-
-#include <stdbool.h>
-#include <stdint.h>
-
-/*!
- * @brief 8-bit bitmap
- *
- * bs_bitmap_t wraps a `unsigned char` buffer
- * representing a bitmap of a certain width
- * and height. The pixels are written into
- * the buffer row by row. This means the
- * index of a pixel is computed like this:
- * `y * width + x`.
- */
-typedef struct bs_bitmap {
-  unsigned char *bs_bitmap;         //!< Dynamically allocated bitmap buffer
-
-  int            bs_bitmap_height;  //!< Height of the bitmap
-  int            bs_bitmap_width;   //!< Width of the bitmap
-  // TODO make unsigned
-} bs_bitmap_t;
-
-/*!
- * @brief Bitmap subset
- *
- * A view represents a cropped bitmap in
- * a cheap manner similar to a string slice.
- */
-typedef struct bs_bm_view {
-  bs_bitmap_t  bs_view_bitmap;
-  int bs_view_offset_x;
-  int bs_view_offset_y;
-  int bs_view_width;
-  int bs_view_height;
-} bs_view_t;
-
-/*!
- * @brief Create a new bitmap
- *
- * Creates a new bitmap with the given width and height.
- * The allocated bitmap is then initialized to hold the
- * value `initial` for every pixel.
- *
- * The caller is responsible for freeing the returned bitmap.
- */
-bs_bitmap_t bs_bitmap_new(int width, int height, unsigned char inital);
-
-/*!
- * @brief Free a bitmap's buffer
- *
- * Frees the buffer allocated for the given bitmap and
- * updates its dimensions to zero width and height, so
- * future operations won't crash. Note that this does
- * _not_ free the bitmap structure itself as it is not
- * intended to be dynamically allocated.
- */
-void bs_bitmap_free(bs_bitmap_t *bitmap);
-
-/*!
- * @brief Increase the size of a bitmap
- *
- * Resizes the bitmap to a new size, but will only increase
- * its size. The newly allocated space is then intialized
- * with the given value.
- */
-bool bs_bitmap_extend(bs_bitmap_t *bitmap, int new_width,
-  int new_height, unsigned char initial_value);
-
-/*!
- * @brief Set a pixel value
- *
- * Sets the pixel at the specified location to the given value
- * or does nothing if the location is out of bounds.
- */
-void bs_bitmap_set(bs_bitmap_t bitmap, int x, int y, unsigned char value);
-
-/*!
- * @brief Get a pixel value
- *
- * Gets the value at the specified location. If the location
- * is out of bounds it returns `def` and sets `errno` to `EINVAL`.
- */
-unsigned char bs_bitmap_get(bs_bitmap_t bitmap, int x, int y, unsigned char def);
-
-/*!
- * @brief Copy a bitmap into another one
- *
- * Copies the source bitmap into the destination one with the
- * given offset. Any overflow is cut off, offsets may be
- * negative as well.
- */
-void bs_bitmap_copy(bs_bitmap_t destination, int offset_x,
-  int offset_y, bs_bitmap_t source);
-
-/*!
- * @brief Print a representation of a bitmap to stdout
- *
- * Uses the unicode block character to render a representation
- * of the bitmap. If `binary_image` is false, the image is
- * considered as a grayscale image and all values greater than
- * 0x80 are rendered as “white” pixels, all below as “black”
- * pixels. Else 1 is “white”, 0 is “black”.
- */
-void bs_bitmap_print(bs_bitmap_t bitmap, bool binary_image);
-
-/*
- * @brief Compact a binary bitmap
- *
- * This converts a binary bitmap into a more compact
- * representation which every byte stores 8 pixels
- * instead of just 1. The highest bit represents the
- * pixel that comes first in the bitmap.
- *
- * The resulting format is precisely what the
- * [Flidpot UDP protocol](https://wiki.openlab-augsburg.de/Flipdots#per-udp-schnittstelle)
- * requires.
- *
- * `view` describes the bitmap to be used and the area
- * of it. `size` will hold the length of the returned array.
- *
- * If the `view` contains areas which are not covered by its
- * bitmap, these pixels are treated as if they had the value
- * `def`.
- *
- * On error `NULL` is returned and `size` is 0. The allocated
- * memory must be freed by the caller.
- */
-uint8_t *bs_view_bitarray(bs_view_t view, size_t *size, unsigned char def);
-
-/*!
- * @name Bitmap Processing
- * @{
- */
-
-/*!
- * @brief Map a bitmap
- *
- * Calls the provided function on every pixel of the bitmap
- * and sets it to the returned value.
- */
-void bs_bitmap_map(bs_bitmap_t bitmap, unsigned char (*fun)(unsigned char));
-
-/*!
- * @brief Invert a binary pixel
- *
- * To be used with bs_bitmap_map().
- */
-unsigned char bs_pixel_invert_binary(unsigned char);
-
-/*!
- * @brief Invert a grayscale pixel
- *
- * To be used with bs_bitmap_map().
- */
-unsigned char bs_pixel_invert_grayscale(unsigned char);
-
-/*!
- * @brief Convert a grayscale pixel to binary
- *
- * To be used with bs_bitmap_map().
- */
-unsigned char bs_pixel_to_binary(unsigned char);
-
-/*!
- * @brief convert a binary pixel to grayscale
- *
- * To be used with bs_bitmap_map().
- */
-unsigned char bs_pixel_to_grayscale(unsigned char);
-
-//! @}
-
-#endif
diff --git a/include/buchstabensuppe/flipdot.h b/include/buchstabensuppe/flipdot.h
deleted file mode 100644
index f74ae10..0000000
--- a/include/buchstabensuppe/flipdot.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*!
- * @file buchstabensuppe/flipdot.h
- *
- * Facilities for rendering bitmaps onto flipdot displays
- * and useful bitmap manipulation when targeting flipdot displays.
- */
-#ifndef BUCHSTABENSUPPE_FLIPDOT_H
-#define BUCHSTABENSUPPE_FLIPDOT_H
-
-#include <stdbool.h>     /* bool     */
-#include <sys/socket.h>  /* sockaddr */
-
-#include <buchstabensuppe/bitmap.h>
-
-/*!
- * @brief Render a bitmap view onto a flipdot display
- *
- * This function renders a view to a flipdot display compatible bitarray
- * using bs_view_bitmap() and sends it to a display listening at the given
- * address using a given socket.
- *
- * The viewed bitmap must be a binary bitmap for this to work properly.
- * Zero is black, all values greater than zero are white.
- *
- * @param sockfd          file descriptor of a `SOCK_DGRAM` socket
- * @param addr            address of the target flipdot display
- * @param addrlen         length of the address structure
- * @param view            bitmap view to render
- * @param overflow_color  value area outside of the picture should get (either 0 or 1)
- */
-int bs_flipdot_render(int sockfd, struct sockaddr *addr, socklen_t addrlen,
-  bs_view_t view, unsigned char overflow_color);
-
-/*!
- * @brief Axis description
- *
- * Describes which direction to perform a movement in for
- * bs_scroll_next_view() and bs_page_next_view().
- */
-enum bs_dimension {
-  BS_DIMENSION_X,    //!< X Axis
-  BS_DIMENSION_Y,    //!< Y Axis
-};
-
-/*!
- * @brief Calculates next view for a one dimensional scroll through a bitmap.
- *
- * Advance a bitmap view by `step` in a given dimension. Will return `true`
- * as soon as the bitmap is out of view and wrap around, i. e. sets the offset
- * to `-len`. This is intended to provide the view for the next frame to be
- * rendered to a (flipdot) display.
- *
- * The given view is expected to be fully intialized and `bs_view_width` and
- * `bs_view_height` to be equal to the dimensions of the target screen. Also
- * the first view position must be set by the caller.
- *
- * @param view bitmap view to alter
- * @param step step to advance by
- * @param dim  dimension to advance in
- *
- * @return true if the bitmap has come out of view,
- *         i. e. the scrolling motion is finished
- */
-bool bs_scroll_next_view(bs_view_t *view, int step, enum bs_dimension dim);
-
-/*!
- * @brief Calculates next view for one dimensional paging through a bitmap.
- *
- * This is similar to bs_scroll_next_view(), but the scroll step is the target
- * display's width or height and the picture is never scrolled out of view.
- *
- * If the edge of the bitmap is in view, true is returned and the offset is
- * set so the first page is in view.
- *
- * @param view bitmap view to alter
- * @param step step to advance by
- * @param dim  dimension to advance in
- *
- * @return true if another page would mean the bitmap would come out of view
- *         i. e. all pages have been viewed
- */
-bool bs_page_next_view(bs_view_t *view, int direction, enum bs_dimension dim);
-
-#endif
diff --git a/meson.build b/meson.build
index 07c00f2..f44c45c 100644
--- a/meson.build
+++ b/meson.build
@@ -30,11 +30,6 @@ lib = library(
   install : true,
 )
 install_headers('include/buchstabensuppe.h')
-install_headers(
-  'include/buchstabensuppe/flipdot.h',
-  'include/buchstabensuppe/bitmap.h',
-  subdir : 'buchstabensuppe',
-)
 pc.generate(
   lib,
   description : 'A toy font rendering library for high contrast, low pixel count displays',