A C library for manipulating bitmap/raster graphics in memory and on disk.
#include <stdio.h>
#include "bmp.h"
int main(int argc, char *argv[]) {
Bitmap *b = bm_create(128,128);
bm_set_color(b, bm_atoi("white"));
bm_puts(b, 30, 60, "Hello World");
bm_save(b, "out.gif");
bm_free(b);
return 0;
}
The code is licensed under the terms of the MIT-0 License. See the file LICENSE for details.
Attribution is appreciated, but not required.
Features:
bm_load_stb()
for more information.
A copy of stb_image.h
has been placed in /3rd-party/stb_image.h
.stb_image_write.h
has been placed in /3rd-party/stb_image_write.h
.bm_bind()
function. It can also serve as a back end for
Cairo graphicsSDL_RWops
file manipulation routines for loading images
in the supported formats.The fonts/
directory contains some 8-bit style bitmap fonts in XBM format.
Copy bmp.c
and bmp.h
to your project directory, and add bmp.c
to your
list of files to compile.
To enable PNG support you need zlib and libpng (the development versions) installed. If you are using GCC, do the following:
-DUSEPNG `libpng-config --cflags`
when compiling.`libpng-config --ldflags` -lz
when linking.Other compilers might have diffent flags. See the libpng documentation for your platform.
Likewise, to enable JPEG support, you need libjpeg installed and specify
the -DUSEJPG
command line option when compiling and add -ljpeg
to your
linker options.
To use stb_image, put the stb_image.h
file in the same directory as
bmp.c
(or use your compiler's -I
option to point it to stb_image.h
's
path), and add -DUSESTB
to your compiler flags.
Similarly, to use stb_image_write, put the stb_image_write.h
file in the
same directory as bmp.c
, and add -DUSESTBW
to your compiler flags.
Use bm_create()
to create Bitmap
objects and bm_free()
to destroy them.
bm_bind()
can be used to wrap a Bitmap object around an existing buffer of
bytes, such as OpenGL textures and SDL surfaces.
The Makefile
generates HTML documentation from bmp.h
through the
d.awk script. Type make docs
to create the documentation.
A basic CMakeLists.txt
file is also provided for CMake, but you might need
to adapt it to your specific needs. To build with CMake, use the following commands:
mkdir build; cd build
cmake -G "Unix Makefiles" ..
make
fonts/
directory contains some 8×8 bitmap fonts in XBM format
that can be loaded via the bm_make_xbm_font()
function.
INSTRUCTIONS
file contains information for using them.tomthumb.c
file contains a 4×6 font based on the "Tom Thumb"
monospace font at http://robey.lag.net/2010/01/23/tiny-monospace-font.htmlftypefont/
directory contains a wrapper for
FreeType to allow rendering of freetype-supported
fonts on Bitmap
structures.misc/
directory contains
gif.c
and gif.h
- code for programmatically manipulating animated GIFs.
It originates from the file I used to develop the GIF encoder/decoder
originally.cairoback.c
- A demo of how the bitmap objects can be used as a back-end
for the Cairo graphics librarypalette/
subdirectory contains a utility for generating palettes and
converting images to those palettes.xpm.c
: Samples on how to use the module with the XPM file
format. to_xbm.c
contains a function that can output a bitmap as a XBM.kmeans.c
contains a program that uses
K-means clustering to
identify the dominant colors in an image.imgdup.c
is a program that scans directories for duplicate images using
the dHash algorithm.nanosvg.c
is an example of how to use the library with Mikko Mononen's NanoSVG
library to load SVG files.bm_microui.c
contains functions to render rxi
's microui graphical
user interfaces to a Bitmap
structure.cp437.c
and cp437.h
contains a Code page 437 BmFont
and
some utility functions to draw a grid-based TUI screen.bdffont.c
contains code to load and draw BDF fonts as BmFont
objects.bgichr.h
is a set of functions that can handle old Borland BGI fonts
(usually files with a .CHR
extension) as BmFont
objects.README
file in the SFont distribution discusses the details.bm_rotate_cw()
and bm_rotate_ccw()
functions, then I ought to have
flip horizontal and vertical functions as well for completeness.bm_rotate_cw()
and bm_rotate_ccw()
functions take the clipping rect into account,
I should consider doing the same for some of the other API functions for consistency, like
bm_resample()
and co. Also the flip functions suggested above.qoi_decode()
function didn't look like it'd fit in nicely with the BmReader
interface.