better structure
[vg.git] / src / qoiconv.c
diff --git a/src/qoiconv.c b/src/qoiconv.c
new file mode 100644 (file)
index 0000000..366e92c
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+
+Command line tool to convert between png <> qoi format
+
+Requires "stb_image.h" and "stb_image_write.h"
+Compile with: 
+       gcc qoiconv.c -std=c99 -O3 -o qoiconv
+
+Dominic Szablewski - https://phoboslab.org
+
+
+-- LICENSE: The MIT License(MIT)
+
+Copyright(c) 2021 Dominic Szablewski
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files(the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions :
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+
+#define STB_IMAGE_IMPLEMENTATION
+#define STBI_ONLY_PNG
+#define STBI_NO_LINEAR
+#include "stb/stb_image.h"
+
+//#define STB_IMAGE_WRITE_IMPLEMENTATION
+//#include "stb_image_write.h"
+
+#define QOI_IMPLEMENTATION
+#include "phoboslab/qoi.h"
+
+
+#define STR_ENDS_WITH(S, E) (strcmp(S + strlen(S) - (sizeof(E)-1), E) == 0)
+
+int main(int argc, char **argv) {
+       if (argc < 3) {
+               printf("Usage: qoiconv <infile> <outfile>\n");
+               printf("Examples:\n");
+               printf("  qoiconv input.png output.qoi\n");
+               printf("  qoiconv input.qoi output.png\n");
+               exit(1);
+       }
+       
+       stbi_set_flip_vertically_on_load(1);
+
+       void *pixels = NULL;
+       int w, h, channels;
+       if (STR_ENDS_WITH(argv[1], ".png")) {
+               pixels = (void *)stbi_load(argv[1], &w, &h, &channels, 4);
+       }
+       else if (STR_ENDS_WITH(argv[1], ".qoi")) {
+               qoi_desc desc;
+               pixels = qoi_read(argv[1], &desc, 0);
+               channels = desc.channels;
+               w = desc.width;
+               h = desc.height;
+       }
+
+       if (pixels == NULL) {
+               printf("Couldn't load/decode %s\n", argv[1]);
+               exit(1);
+       }
+
+       int encoded = 0;
+       if (STR_ENDS_WITH(argv[2], ".png")) {
+               //encoded = stbi_write_png(argv[2], w, h, channels, pixels, 0);
+       }
+       else if (STR_ENDS_WITH(argv[2], ".qoi")) {
+               encoded = qoi_write(argv[2], pixels, &(qoi_desc){
+                       .width = w,
+                       .height = h, 
+                       .channels = 4,
+                       .colorspace = QOI_SRGB
+               });
+       }
+
+       if (!encoded) {
+               printf("Couldn't write/encode %s\n", argv[2]);
+               exit(1);
+       }
+
+       free(pixels);
+       return 0;
+}