Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FARBFELD(5)		      File Formats Manual		   FARBFELD(5)

NAME
       farbfeld	-- suckless image format

DESCRIPTION
       farbfeld	 is  a	lossless image format which is easy to parse, pipe and
       compress.  It has the following format:

       BYTES	DESCRIPTION
       8	"farbfeld" magic value
       4	32-Bit BE unsigned integer (width)
       4	32-Bit BE unsigned integer (height)
       [2222]	4*16-Bit BE unsigned integers [RGBA] / pixel, row-major

       The RGB-data should be sRGB for best interoperability  and  not	alpha-
       premultiplied.

USAGE
       farbfeld	provides the tools 2ff(1), jpg2ff(1), png2ff(1)	and ff2jpg(1),
       ff2pam(1),  ff2png(1), ff2ppm(1)	to convert to and from farbfeld	images
       respectively.

       bzip2(1)	is recommended for compression,	giving results comparable with
       PNG for photographs and much better results for other image types.

       The file	extension is ".ff" and compression  extensions	shall  be  ap-
       pended (e.g. ".ff.bz2").

MOTIVATION
       farbfeld	 was  created  because	the  author was	not satisfied with the
       boilerplate and inherent	complexity involved in handling	 common	 image
       formats (PNG, JPEG, GIF,...), having to rely on bloated libraries while
       not  being able to focus	on the task at hand for	a given	image process-
       ing problem.

EXAMPLES
       The following code listing invert.c is a	 ready-to-use  color  inverter
       with  all  necessary  error handling and	reporting. This	program	can be
       integrated into a farbfeld pipeline as follows:

       $ png2ff	< image.png | invert | ff2png >	image-inverted.png

       It shall	be noted here that due to the simplicity of the	format no  ex-
       ternal  libraries  are  needed  to  handle the farbfeld image data. The
       0BSD-License gives you the freedom to throw away	the license block  and
       just use	the code as you	wish. Happy hacking!

       /*
	* 0BSD-License
	*
	* (c) 2017 Laslo Hunhold <dev@frign.de>
	*
	* Permission to	use, copy, modify, and/or distribute this software for
	* any purpose with or without fee is hereby granted.
	*
	* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
	* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL	IMPLIED
	* WARRANTIES OF	MERCHANTABILITY	AND FITNESS. IN	NO EVENT SHALL THE
	* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
	* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS	OF USE,	DATA OR
	* PROFITS, WHETHER IN AN ACTION	OF CONTRACT, NEGLIGENCE	OR OTHER
	* TORTIOUS ACTION, ARISING OUT OF OR IN	CONNECTION WITH	THE USE	OR
	* PERFORMANCE OF THIS SOFTWARE.
	*/
       #include	<arpa/inet.h>

       #include	<errno.h>
       #include	<stdint.h>
       #include	<stdio.h>
       #include	<string.h>

       #define LEN(x) (sizeof (x) / sizeof *(x))

       static void
       invert(uint16_t rgba[4])
       {
	       rgba[0] = UINT16_MAX - rgba[0];
	       rgba[1] = UINT16_MAX - rgba[1];
	       rgba[2] = UINT16_MAX - rgba[2];
       }

       int
       main(int	argc, char *argv[])
       {
	       uint32_t	hdr[4],	width, height, i, j, k;
	       uint16_t	rgba[4];

	       /* arguments */
	       if (argc	!= 1) {
		       fprintf(stderr, "usage: %s\n", argv[0]);
		       return 1;
	       }

	       /* read header */
	       if (fread(hdr, sizeof(*hdr), LEN(hdr), stdin) !=	LEN(hdr)) {
		       goto readerr;
	       }
	       if (memcmp("farbfeld", hdr, sizeof("farbfeld") -	1)) {
		       fprintf(stderr, "%s: invalid magic value\n", argv[0]);
		       return 1;
	       }
	       width = ntohl(hdr[2]);
	       height =	ntohl(hdr[3]);

	       /* write	data */
	       if (fwrite(hdr, sizeof(*hdr), LEN(hdr), stdout) != 4) {
		       goto writerr;
	       }

	       for (i =	0; i < height; i++) {
		       for (j =	0; j < width; j++) {
			       if (fread(rgba, sizeof(*rgba), LEN(rgba),
					 stdin)	!= LEN(rgba)) {
				       goto readerr;
			       }
			       for (k =	0; k < 4; k++) {
				       rgba[k] = ntohs(rgba[k]);
			       }

			       invert(rgba);

			       for (k =	0; k < 4; k++) {
				       rgba[k] = htons(rgba[k]);
			       }
			       if (fwrite(rgba,	sizeof(*rgba), LEN(rgba),
					  stdout) != LEN(rgba))	{
				       goto writerr;
			       }
		       }
	       }

	       /* clean	up */
	       if (fclose(stdout)) {
		       fprintf(stderr, "%s: fclose: %s\n", argv[0],
			       strerror(errno));
		       return 1;
	       }

	       return 0;
       readerr:
	       fprintf(stderr, "%s: fread: Unexpected EOF\n", argv[0]);
	       return 1;
       writerr:
	       fprintf(stderr, "%s: fwrite: %s\n", argv[0], strerror(errno));
	       return 1;
       }

SEE ALSO
       2ff(1),	 ff2jpg(1),   ff2pam(1),   ff2png(1),	ff2ppm(1),  jpg2ff(1),
       png2ff(1)

AUTHORS
       Laslo Hunhold <dev@frign.de>

suckless.org			  2018-04-11			   FARBFELD(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=farbfeld&sektion=5&manpath=FreeBSD+Ports+15.0>

home | help