farbfeld.5 (4301B)
1 .Dd 2018-04-11 2 .Dt FARBFELD 5 3 .Os suckless.org 4 .Sh NAME 5 .Nm farbfeld 6 .Nd suckless image format 7 .Sh DESCRIPTION 8 .Nm 9 is a 10 .Em lossless 11 image format which is easy to parse, pipe and compress. 12 It has the following format: 13 .Bd -literal -offset left 14 BYTES DESCRIPTION 15 8 "farbfeld" magic value 16 4 32-Bit BE unsigned integer (width) 17 4 32-Bit BE unsigned integer (height) 18 [2222] 4*16-Bit BE unsigned integers [RGBA] / pixel, row-major 19 .Ed 20 .Pp 21 The RGB-data should be sRGB for best interoperability and not 22 alpha-premultiplied. 23 .Sh USAGE 24 .Nm 25 provides the tools 26 .Xr 2ff 1 , 27 .Xr jpg2ff 1 , 28 .Xr png2ff 1 29 and 30 .Xr ff2jpg 1 , 31 .Xr ff2pam 1 , 32 .Xr ff2png 1 , 33 .Xr ff2ppm 1 34 to 35 .Em convert 36 to and from farbfeld images respectively. 37 .Pp 38 .Xr bzip2 1 39 is recommended for 40 .Em compression , 41 giving results comparable with PNG for photographs and much better results 42 for other image types. 43 .sp 44 The 45 .Em file extension 46 is ".ff" and compression extensions shall be 47 appended (e.g. ".ff.bz2"). 48 .Sh MOTIVATION 49 .Nm 50 was created because the author was not satisfied with the boilerplate 51 and inherent complexity involved in handling common image formats 52 (PNG, JPEG, GIF,...), having to rely on bloated libraries while not being 53 able to focus on the task at hand for a given image processing problem. 54 .Sh EXAMPLES 55 The following code listing 56 .Em invert.c 57 is a ready-to-use color inverter with all necessary error handling and 58 reporting. This program can be integrated into a farbfeld pipeline as 59 follows: 60 .Pp 61 $ png2ff < image.png | invert | ff2png > image-inverted.png 62 .Pp 63 It shall be noted here that due to the simplicity of the format no 64 external libraries are needed to handle the farbfeld image data. The 65 0BSD-License gives you the freedom to throw away the license block and 66 just use the code as you wish. Happy hacking! 67 .Bd -literal -offset left 68 /* 69 * 0BSD-License 70 * 71 * (c) 2017 Laslo Hunhold <dev@frign.de> 72 * 73 * Permission to use, copy, modify, and/or distribute this software for 74 * any purpose with or without fee is hereby granted. 75 * 76 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 77 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 78 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 79 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 80 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 81 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 82 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 83 * PERFORMANCE OF THIS SOFTWARE. 84 */ 85 #include <arpa/inet.h> 86 87 #include <errno.h> 88 #include <stdint.h> 89 #include <stdio.h> 90 #include <string.h> 91 92 #define LEN(x) (sizeof (x) / sizeof *(x)) 93 94 static void 95 invert(uint16_t rgba[4]) 96 { 97 rgba[0] = UINT16_MAX - rgba[0]; 98 rgba[1] = UINT16_MAX - rgba[1]; 99 rgba[2] = UINT16_MAX - rgba[2]; 100 } 101 102 int 103 main(int argc, char *argv[]) 104 { 105 uint32_t hdr[4], width, height, i, j, k; 106 uint16_t rgba[4]; 107 108 /* arguments */ 109 if (argc != 1) { 110 fprintf(stderr, "usage: %s\\n", argv[0]); 111 return 1; 112 } 113 114 /* read header */ 115 if (fread(hdr, sizeof(*hdr), LEN(hdr), stdin) != LEN(hdr)) { 116 goto readerr; 117 } 118 if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { 119 fprintf(stderr, "%s: invalid magic value\\n", argv[0]); 120 return 1; 121 } 122 width = ntohl(hdr[2]); 123 height = ntohl(hdr[3]); 124 125 /* write data */ 126 if (fwrite(hdr, sizeof(*hdr), LEN(hdr), stdout) != 4) { 127 goto writerr; 128 } 129 130 for (i = 0; i < height; i++) { 131 for (j = 0; j < width; j++) { 132 if (fread(rgba, sizeof(*rgba), LEN(rgba), 133 stdin) != LEN(rgba)) { 134 goto readerr; 135 } 136 for (k = 0; k < 4; k++) { 137 rgba[k] = ntohs(rgba[k]); 138 } 139 140 invert(rgba); 141 142 for (k = 0; k < 4; k++) { 143 rgba[k] = htons(rgba[k]); 144 } 145 if (fwrite(rgba, sizeof(*rgba), LEN(rgba), 146 stdout) != LEN(rgba)) { 147 goto writerr; 148 } 149 } 150 } 151 152 /* clean up */ 153 if (fclose(stdout)) { 154 fprintf(stderr, "%s: fclose: %s\\n", argv[0], 155 strerror(errno)); 156 return 1; 157 } 158 159 return 0; 160 readerr: 161 fprintf(stderr, "%s: fread: Unexpected EOF\\n", argv[0]); 162 return 1; 163 writerr: 164 fprintf(stderr, "%s: fwrite: %s\\n", argv[0], strerror(errno)); 165 return 1; 166 } 167 .Ed 168 .Sh SEE ALSO 169 .Xr 2ff 1 , 170 .Xr ff2jpg 1 , 171 .Xr ff2pam 1 , 172 .Xr ff2png 1 , 173 .Xr ff2ppm 1 , 174 .Xr jpg2ff 1 , 175 .Xr png2ff 1 176 .Sh AUTHORS 177 .An Laslo Hunhold Aq Mt dev@frign.de