{"id":16186898,"url":"https://github.com/robloach/pntr","last_synced_at":"2025-03-16T10:32:03.477Z","repository":{"id":65709144,"uuid":"593965280","full_name":"RobLoach/pntr","owner":"RobLoach","description":"Image manipulation library for C, with a focus on ease of use.","archived":false,"fork":false,"pushed_at":"2024-05-19T15:55:22.000Z","size":2915,"stargazers_count":14,"open_issues_count":33,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-19T23:21:08.378Z","etag":null,"topics":["c99","header-only","pntr"],"latest_commit_sha":null,"homepage":"https://robloach.github.io/pntr/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"zlib","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RobLoach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-27T09:13:19.000Z","updated_at":"2024-06-23T05:54:45.634Z","dependencies_parsed_at":"2023-02-19T02:31:26.259Z","dependency_job_id":"8543ca75-9a6d-4f36-9a56-98cc45181ee7","html_url":"https://github.com/RobLoach/pntr","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobLoach%2Fpntr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobLoach%2Fpntr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobLoach%2Fpntr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobLoach%2Fpntr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RobLoach","download_url":"https://codeload.github.com/RobLoach/pntr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243814898,"owners_count":20352037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c99","header-only","pntr"],"created_at":"2024-10-10T07:19:46.628Z","updated_at":"2025-03-16T10:32:03.469Z","avatar_url":"https://github.com/RobLoach.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pntr \u003ca href=\"https://github.com/robloach/pntr\"\u003e\u003cimg src=\"examples/resources/logo-55x55.png\" align=left width=55 height=55 /\u003e\u003c/a\u003e\n\nImage manipulation library for [C99](https://en.wikipedia.org/wiki/C99_(C_standard_revision)) or C++, with a focus on ease-of-use.\n\n## Usage\n\n``` c\n#define PNTR_PIXELFORMAT_RGBA\n#define PNTR_IMPLEMENTATION\n#include \"pntr.h\"\n\nint main() {\n    pntr_image* image = pntr_new_image(200, 200);\n    pntr_draw_circle_fill(image, 100, 100, 80, PNTR_RED);\n    pntr_save_image(image, \"output.png\");\n    pntr_unload_image(image);\n\n    return 0;\n}\n```\n\n## Examples\n\n[![Example: Image](examples/pntr_examples_image.png)](examples/pntr_examples_image.h)\n[![Example: Shapes](examples/pntr_examples_shapes.png)](examples/pntr_examples_shapes.h)\n[![Example: Fonts](examples/pntr_examples_fonts.png)](examples/pntr_examples_fonts.h)\n[![Example: Sprite](examples/pntr_examples_sprite.png)](examples/pntr_examples_sprite.h)\n\n## Integrations\n\n| Name | Description |\n| ---- | ----------- |\n| [pntr_app](https://github.com/RobLoach/pntr_app) | Application wrapper for running the same pntr code in raylib, SDL, Web, libretro, or in a CLI |\n| [pntr_assetsys](https://github.com/RobLoach/pntr_assetsys) | Load pntr assets from *.zip* files with [assetsys.h](https://github.com/mattiasgustavsson/libs/blob/main/assetsys.h) |\n| [pntr_physfs](https://github.com/RobLoach/pntr_physfs) | Load pntr assets from *.zip* files with [PhysicsFS](https://github.com/icculus/physfs) |\n| [pntr_nuklear](https://github.com/RobLoach/pntr_nuklear) | [Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) immediate-mode graphical user interface for pntr |\n| [pntr_aseprite](https://github.com/RobLoach/pntr_aseprite) | Use [Aseprite](https://github.com/RobLoach/pntr_aseprite) animated sprites in pntr |\n| [pntr_tiled](https://github.com/RobLoach/pntr_tiled) | Display [Tiled](https://www.mapeditor.org/) 2D level editor maps in pntr |\n| [pntr_portablegl](https://github.com/RobLoach/pntr_portablegl) | Use the OpenGL-esque software rendering library, [PortableGL](https://github.com/rswinkle/PortableGL), in pntr |\n| [pntr_doom](https://github.com/RobLoach/pntr_doom) | Play DOOM via [PureDOOM](https://github.com/Daivuk/PureDOOM/) rendered through pntr |\n| [pntr_pixelfont](https://github.com/RobLoach/pntr_pixelfont) | Additional pixel fonts outside of the default |\n\n## API\n\nThis covers how to use *pntr*.\n\n### Configuration\n\nAdd these defines prior to including `pntr.h` to modify how it functions.\n\n| Define | Description |\n| --- | --- |\n| `PNTR_IMPLEMENTATION` | Define this in one of your `.c` or `.cpp` files before including `pntr.h` |\n| `PNTR_PIXELFORMAT_RGBA` | Use the `RGBA` format |\n| `PNTR_PIXELFORMAT_ARGB` | Use the `ARGB` pixel format |\n| `PNTR_ENABLE_DEFAULT_FONT` | Enables the default font |\n| `PNTR_ENABLE_MATH` | Enables use of C's standard [`math.h`](https://en.cppreference.com/w/c/numeric/math) linked library, rather than using the built in math functions |\n| `PNTR_ENABLE_TTF` | Enables support for loading [TrueType fonts](https://en.wikipedia.org/wiki/TrueType_fonts) |\n| `PNTR_ENABLE_UTF8` | Enables [UTF-8](https://en.wikipedia.org/wiki/UTF-8) support for font loading and text rendering |\n| `PNTR_LOAD_FILE` | Callback to use when asked to load a file in `pntr_load_file()`. By default, will use `stdio.h`. |\n| `PNTR_LOAD_IMAGE_FROM_MEMORY` | Callback to use when loading an image from memory via `pntr_load_image_from_memory()`. By default, will use  [stb_image](https://github.com/nothings/stb/blob/master/stb_image.h) |\n| `PNTR_SAVE_FILE` | Callback to use when saving a file via `pntr_save_file()`. By default, uses `stdio.h` |\n| `PNTR_SAVE_IMAGE_TO_MEMORY` | Callback to use when saving an image to memory via `pntr_save_image_to_memory()`. By default, will use [stb_image_write](https://github.com/nothings/stb/blob/master/stb_image_write.h) |\n| `PNTR_NO_ALPHABLEND` | Skips alpha blending when drawing pixels |\n| `PNTR_NO_STDIO` | Will disable the standard file loading/saving calls for `PNTR_LOAD_FILE` and `PNTR_SAVE_FILE` |\n| `PNTR_NO_SAVE_IMAGE` | Disables the default behavior of image saving |\n| `PNTR_NO_LOAD_IMAGE` | Disables the default behavior of image loading |\n| `PNTR_NO_CUTE_PNG_IMPLEMENTATION` | Skips defining `CUTE_PNG_IMPLEMENTATION`. Useful if you're using cute_png elsewhere |\n| `PNTR_NO_STB_TRUETYPE_IMPLEMENTATION` | Skips defining `STB_TRUETYPE_IMPLEMENTATION`. Useful if you're using stb_truetype elsewhere |\n| `PNTR_NO_STB_IMAGE_WRITE_IMPLEMENTATION` | Skips defining `STB_IMAGE_WRITE_IMPLEMENTATION`. useful if you're using stb_image_write elsewhere |\n| `PNTR_NO_STB_IMAGE_IMPLEMENTATION` | Skips defining `STB_IMAGE_IMPLEMENTATION`. useful if you're using stb_image_write elsewhere |\n\n### Functions\n\n``` c\npntr_image* pntr_new_image(int width, int height);\npntr_image* pntr_gen_image_color(int width, int height, pntr_color color);\npntr_image* pntr_image_copy(pntr_image* image);\npntr_image* pntr_image_from_image(pntr_image* image, int x, int y, int width, int height);\npntr_image* pntr_image_subimage(pntr_image* image, int x, int y, int width, int height);\npntr_rectangle pntr_image_get_clip(pntr_image* image);\nvoid pntr_image_set_clip(pntr_image* image, int x, int y, int width, int height);\nvoid pntr_image_reset_clip(pntr_image* image);\nvoid pntr_unload_image(pntr_image* image);\nvoid pntr_clear_background(pntr_image* image, pntr_color color);\n\nvoid pntr_draw_point(pntr_image* dst, int x, int y, pntr_color color);\nvoid pntr_draw_point_vec(pntr_image* dst, pntr_vector* point, pntr_color color);\nvoid pntr_draw_points(pntr_image* dst, pntr_vector* points, int pointsCount, pntr_color color);\nvoid pntr_draw_line(pntr_image* dst, int startPosX, int startPosY, int endPosX, int endPosY, pntr_color color);\nvoid pntr_draw_line_horizontal(pntr_image* dst, int posX, int posY, int width, pntr_color color);\nvoid pntr_draw_line_horizontal_thick(pntr_image* dst, int posX, int posY, int width, int thickness, pntr_color color);\nvoid pntr_draw_line_thick(pntr_image* dst, int startPosX, int startPosY, int endPosX, int endPosY, int thickness, pntr_color color);\nvoid pntr_draw_line_thick_vec(pntr_image* dst, pntr_vector start, pntr_vector end, int thickness, pntr_color color);\nvoid pntr_draw_line_vec(pntr_image* dst, pntr_vector start, pntr_vector end, pntr_color color);\nvoid pntr_draw_line_vertical(pntr_image* dst, int posX, int posY, int height, pntr_color color);\nvoid pntr_draw_line_vertical_thick(pntr_image* dst, int posX, int posY, int height, int thickness, pntr_color color);\nvoid pntr_draw_rectangle(pntr_image* dst, int posX, int posY, int width, int height, pntr_color color);\nvoid pntr_draw_rectangle_fill(pntr_image* dst, int posX, int posY, int width, int height, pntr_color color);\nvoid pntr_draw_rectangle_fill_rec(pntr_image* dst, pntr_rectangle rect, pntr_color color);\nvoid pntr_draw_rectangle_gradient(pntr_image* dst, int x, int y, int width, int height, pntr_color topLeft, pntr_color topRight, pntr_color bottomLeft, pntr_color bottomRight);\nvoid pntr_draw_rectangle_gradient_rec(pntr_image* dst, pntr_rectangle rect, pntr_color topLeft, pntr_color topRight, pntr_color bottomLeft, pntr_color bottomRight);\nvoid pntr_draw_rectangle_rec(pntr_image* dst, pntr_rectangle rec, pntr_color color);\nvoid pntr_draw_rectangle_thick(pntr_image* dst, int posX, int posY, int width, int height, int thickness, pntr_color color);\nvoid pntr_draw_rectangle_thick_rec(pntr_image* dst, pntr_rectangle rect, int thickness, pntr_color color);\nvoid pntr_draw_triangle(pntr_image* dst, int x1, int y1, int x2, int y2, int x3, int y3, pntr_color color);\nvoid pntr_draw_triangle_fill(pntr_image* dst, int x1, int y1, int x2, int y2, int x3, int y3, pntr_color color);\nvoid pntr_draw_triangle_fill_vec(pntr_image* dst, pntr_vector point1, pntr_vector point2, pntr_vector point3, pntr_color color);\nvoid pntr_draw_triangle_thick(pntr_image* dst, int x1, int y1, int x2, int y2, int x3, int y3, int thickness, pntr_color color);\nvoid pntr_draw_triangle_thick_vec(pntr_image* dst, pntr_vector point1, pntr_vector point2, pntr_vector point3, int thickness, pntr_color color);\nvoid pntr_draw_triangle_vec(pntr_image* dst, pntr_vector point1, pntr_vector point2, pntr_vector point3, pntr_color color);\nvoid pntr_draw_ellipse(pntr_image* dst, int centerX, int centerY, int radiusX, int radiusY, pntr_color color);\nvoid pntr_draw_ellipse_fill(pntr_image* dst, int centerX, int centerY, int radiusX, int radiusY, pntr_color color);\nvoid pntr_draw_ellipse_thick(pntr_image* dst, int centerX, int centerY, int radiusX, int radiusY, int thickness, pntr_color color);\nvoid pntr_draw_circle(pntr_image* dst, int centerX, int centerY, int radius, pntr_color color);\nvoid pntr_draw_circle_fill(pntr_image* dst, int centerX, int centerY, int radius, pntr_color color);\nvoid pntr_draw_circle_thick(pntr_image* dst, int centerX, int centerY, int radius, int thickness, pntr_color color);\nvoid pntr_draw_polygon(pntr_image* dst, pntr_vector* points, int numPoints, pntr_color color);\nvoid pntr_draw_polygon_fill(pntr_image* dst, pntr_vector* points, int numPoints, pntr_color color);\nvoid pntr_draw_polygon_thick(pntr_image* dst, pntr_vector* points, int numPoints, int thickness, pntr_color color);\nvoid pntr_draw_polyline(pntr_image* dst, pntr_vector* points, int numPoints, pntr_color color);\nvoid pntr_draw_polyline_thick(pntr_image* dst, pntr_vector* points, int numPoints, int thickness, pntr_color color);\nvoid pntr_draw_arc(pntr_image* dst, int centerX, int centerY, float radius, float startAngle, float endAngle, int segments, pntr_color color);\nvoid pntr_draw_arc_fill(pntr_image* dst, int centerX, int centerY, float radius, float startAngle, float endAngle, int segments, pntr_color color);\nvoid pntr_draw_arc_thick(pntr_image* dst, int centerX, int centerY, float radius, float startAngle, float endAngle, int segments, int thickness, pntr_color color);\nvoid pntr_draw_rectangle_rounded(pntr_image* dst, int x, int y, int width, int height, int topLeftRadius, int topRightRadius, int bottomLeftRadius, int bottomRightRadius, pntr_color color);\nvoid pntr_draw_rectangle_rounded_fill(pntr_image* dst, int x, int y, int width, int height, int cornerRadius, pntr_color color);\nvoid pntr_draw_rectangle_thick_rounded(pntr_image* dst, int x, int y, int width, int height, int topLeftRadius, int topRightRadius, int bottomLeftRadius, int bottomRightRadius, int thickness, pntr_color color);\nvoid pntr_draw_image(pntr_image* dst, pntr_image* src, int posX, int posY);\nvoid pntr_draw_image_rec(pntr_image* dst, pntr_image* src, pntr_rectangle srcRect, int posX, int posY);\nvoid pntr_draw_image_tint(pntr_image* dst, pntr_image* src, int posX, int posY, pntr_color tint);\nvoid pntr_draw_image_tint_rec(pntr_image* dst, pntr_image* src, pntr_rectangle srcRect, int posX, int posY, pntr_color tint);\nvoid pntr_draw_image_rotated(pntr_image* dst, pntr_image* src, int posX, int posY, float degrees, float offsetX, float offsetY, pntr_filter filter);\nvoid pntr_draw_image_rotated_rec(pntr_image* dst, pntr_image* src, pntr_rectangle srcRect, int posX, int posY, float degrees, float offsetX, float offsetY, pntr_filter filter);\nvoid pntr_draw_image_flipped(pntr_image* dst, pntr_image* src, int posX, int posY, bool flipHorizontal, bool flipVertical, bool flipDiagonal);\nvoid pntr_draw_image_flipped_rec(pntr_image* dst, pntr_image* src, pntr_rectangle srcRec, int posX, int posY, bool flipHorizontal, bool flipVertical, bool flipDiagonal);\nvoid pntr_draw_image_scaled(pntr_image* dst, pntr_image* src, int posX, int posY, float scaleX, float scaleY, float offsetX, float offsetY, pntr_filter filter);\nvoid pntr_draw_image_scaled_rec(pntr_image* dst, pntr_image* src, pntr_rectangle srcRect, int posX, int posY, float scaleX, float scaleY, float offsetX, float offsetY, pntr_filter filter);\nvoid pntr_draw_text(pntr_image* dst, pntr_font* font, const char* text, int posX, int posY, pntr_color tint);\nvoid pntr_draw_text_len(pntr_image* dst, pntr_font* font, const char* text, int textLength, int posX, int posY, pntr_color tint);\nvoid pntr_draw_text_wrapped(pntr_image* dst, pntr_font* font, const char* text, int posX, int posY, int maxWidth, pntr_color tint);\nvoid pntr_draw_text_ex(pntr_image* dst, pntr_font* font, int posX, int posY, pntr_color tint, const char* text, ...);\npntr_color pntr_new_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);\npntr_color pntr_get_color(unsigned int hexValue);\nunsigned char pntr_color_r(pntr_color color);\nunsigned char pntr_color_g(pntr_color color);\nunsigned char pntr_color_b(pntr_color color);\nunsigned char pntr_color_a(pntr_color color);\nvoid pntr_color_set_r(pntr_color* color, unsigned char r);\nvoid pntr_color_set_g(pntr_color* color, unsigned char g);\nvoid pntr_color_set_b(pntr_color* color, unsigned char b);\nvoid pntr_color_set_a(pntr_color* color, unsigned char a);\npntr_color pntr_image_get_color(pntr_image* image, int x, int y);\nbool pntr_save_file(const char *fileName, const void *data, unsigned int bytesToWrite);\nvoid* pntr_image_to_pixelformat(pntr_image* image, unsigned int* dataSize, pntr_pixelformat pixelFormat);\nbool pntr_save_image(pntr_image* image, const char* fileName);\nunsigned char* pntr_save_image_to_memory(pntr_image* image, pntr_image_type type, unsigned int* dataSize);\nint pntr_get_pixel_data_size(int width, int height, pntr_pixelformat pixelFormat);\npntr_image* pntr_load_image(const char* fileName);\npntr_image* pntr_load_image_from_memory(pntr_image_type type, const unsigned char* fileData, unsigned int dataSize);\npntr_image* pntr_image_from_pixelformat(const void* data, int width, int height, pntr_pixelformat pixelFormat);\nvoid* pntr_set_error(pntr_error error);\nconst char* pntr_get_error(void);\npntr_error pntr_get_error_code(void);\npntr_image* pntr_image_resize(pntr_image* image, int newWidth, int newHeight, pntr_filter filter);\npntr_image* pntr_image_scale(pntr_image* image, float scaleX, float scaleY, pntr_filter filter);\nvoid pntr_image_color_replace(pntr_image* image, pntr_color color, pntr_color replace);\npntr_color pntr_color_tint(pntr_color color, pntr_color tint);\nvoid pntr_image_color_tint(pntr_image* image, pntr_color color);\npntr_color pntr_color_fade(pntr_color color, float alpha);\nvoid pntr_image_color_fade(pntr_image* image, float alpha);\npntr_color pntr_color_brightness(pntr_color color, float factor);\npntr_color pntr_get_pixel_color(void* srcPtr, pntr_pixelformat srcPixelFormat);\nvoid pntr_set_pixel_color(void* dstPtr, pntr_pixelformat dstPixelFormat, pntr_color color);\npntr_font* pntr_load_font_default(void);\nvoid pntr_unload_font(pntr_font* font);\npntr_font* pntr_font_copy(pntr_font* font);\npntr_font* pntr_font_scale(pntr_font* font, float scaleX, float scaleY, pntr_filter filter);\npntr_font* pntr_load_font_bmf(const char* fileName, const char* characters);\npntr_font* pntr_load_font_bmf_from_image(pntr_image* image, const char* characters);\npntr_font* pntr_load_font_bmf_from_memory(const unsigned char* fileData, unsigned int dataSize, const char* characters);\nint pntr_measure_text(pntr_font* font, const char* text);\npntr_vector pntr_measure_text_ex(pntr_font* font, const char* text, int textLength);\npntr_image* pntr_gen_image_text(pntr_font* font, const char* text, pntr_color tint, pntr_color backgroundColor);\npntr_font* pntr_load_font_tty(const char* fileName, int glyphWidth, int glyphHeight, const char* characters);\npntr_font* pntr_load_font_tty_from_memory(const unsigned char* fileData, unsigned int dataSize, int glyphWidth, int glyphHeight, const char* characters);\npntr_font* pntr_load_font_tty_from_image(pntr_image* image, int glyphWidth, int glyphHeight, const char* characters);\nunsigned char* pntr_load_file(const char *fileName, unsigned int *bytesRead);\nvoid pntr_unload_file(unsigned char* fileData);\nconst char* pntr_load_file_text(const char *fileName);\nvoid pntr_unload_file_text(const char* text);\npntr_font* pntr_load_font_ttf(const char* fileName, int fontSize);\npntr_font* pntr_load_font_ttf_from_memory(const unsigned char* fileData, unsigned int dataSize, int fontSize);\npntr_color pntr_color_invert(pntr_color color);\nvoid pntr_image_color_invert(pntr_image* image);\npntr_color pntr_color_alpha_blend(pntr_color dst, pntr_color src);\npntr_rectangle pntr_image_alpha_border(pntr_image* image, float threshold);\nbool pntr_image_crop(pntr_image* image, int x, int y, int width, int height);\nvoid pntr_image_alpha_crop(pntr_image* image, float threshold);\nvoid pntr_image_color_brightness(pntr_image* image, float factor);\nvoid pntr_image_flip(pntr_image* image, bool horizontal, bool vertical);\npntr_color pntr_color_contrast(pntr_color color, float contrast);\nvoid pntr_image_color_contrast(pntr_image* image, float contrast);\nvoid pntr_image_alpha_mask(pntr_image* image, pntr_image* alphaMask, int posX, int posY);\nbool pntr_image_resize_canvas(pntr_image* image, int newWidth, int newHeight, int offsetX, int offsetY, pntr_color fill);\npntr_image* pntr_image_rotate(pntr_image* image, float degrees, pntr_filter filter);\npntr_image* pntr_gen_image_gradient(int width, int height, pntr_color topLeft, pntr_color topRight, pntr_color bottomLeft, pntr_color bottomRight);\npntr_color pntr_color_bilinear_interpolate(pntr_color color00, pntr_color color01, pntr_color color10, pntr_color color11, float coordinateX, float coordinateY);\nvoid* pntr_load_memory(size_t size);\nvoid pntr_unload_memory(void* pointer);\nvoid* pntr_memory_copy(void* destination, void* source, size_t size);\npntr_image_type pntr_get_file_image_type(const char* filePath);\n```\n\n## Development\n\nTo build the tests and examples, use [CMake](https://cmake.org):\n\n``` bash\n# Set up the build files.\ncmake -B build\n\n# Build the tests and examples.\ncmake --build build\n\n# Run the tests\nctest --test-dir build -V\n```\n\n### Documentation\n\nTo build the documentation, use [Doxygen](https://www.doxygen.nl)...\n``` bash\ndoxygen .Doxyfile\n```\n\nTo publish the documentation, [Node.js](https://nodejs.org)...\n``` bash\nnpm run docs\n```\n\n## Acknowledgements\n\n- [Logo](https://www.pixilart.com/art/bob-ross-9910c4da4b3a1c8) by [Ravenist](https://www.pixilart.com/ravenist), used with [permission](https://www.reddit.com/r/PixelArt/comments/fi2b1v/oc_felt_a_little_sad_so_i_watched_bob_ross_videos/j6ordqn/)\n- [cute_png.h](https://github.com/RandyGaul/cute_headers/blob/master/cute_png.h) by [Randy Gaul](https://github.com/RandyGaul)\n- [font8x8](https://github.com/dhepper/font8x8/) by [Daniel Hepper](https://github.com/dhepper) provides the [8x8 monochrome font](https://github.com/dhepper/font8x8/blob/master/font8x8_basic.h)\n- [stb_image.h](https://github.com/nothings/stb/blob/master/stb_image.h) by [Sean Barrett](https://github.com/nothings)\n- [stb_truetype.h](https://github.com/nothings/stb/blob/master/stb_truetype.h) by [Sean Barrett](https://github.com/nothings)\n- [utf8.h](https://github.com/sheredom/utf8.h) by [Neil Henning](https://github.com/sheredom)\n- [tester](https://github.com/zpl-c/tester) from [zpl](https://github.com/zpl-c) provides the unit testing framework\n- [raylib](https://github.com/raysan5/raylib) inspired some of the design patterns\n\n## License\n\nUnless stated otherwise, all works are:\n\n- Copyright (c) 2023 [Rob Loach](https://robloach.net)\n\n... and licensed under:\n\n- [zlib License](LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobloach%2Fpntr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobloach%2Fpntr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobloach%2Fpntr/lists"}