png2c.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5. #define STB_IMAGE_IMPLEMENTATION
  6. #include "./stb_image.h"
  7. const char *shift(int *argc, char ***argv)
  8. {
  9. assert(*argc > 0);
  10. const char *result = *argv[0];
  11. *argc -= 1;
  12. *argv += 1;
  13. return result;
  14. }
  15. int main(int argc, char *argv[])
  16. {
  17. shift(&argc, &argv); // skip program name
  18. if (argc <= 1) {
  19. fprintf(stderr, "Usage: png2c <filepath.png> <name>\n");
  20. fprintf(stderr, "ERROR: expected file path and name\n");
  21. exit(1);
  22. }
  23. const char *filepath = shift(&argc, &argv);
  24. const char *name = shift(&argc, &argv);
  25. int x, y, n;
  26. uint32_t *data = (uint32_t *)stbi_load(filepath, &x, &y, &n, 4);
  27. if (data == NULL) {
  28. fprintf(stderr, "Could not load file `%s`\n", filepath);
  29. exit(1);
  30. }
  31. printf("#ifndef PNG_%s_H_\n", name);
  32. printf("#define PNG_%s_H_\n", name);
  33. printf("size_t %s_width = %d;\n", name, x);
  34. printf("size_t %s_height = %d;\n", name, y);
  35. printf("uint32_t %s_data[] = {", name);
  36. for (size_t i = 0; i < (size_t)(x * y); ++i) {
  37. printf("0x%x, ", data[i]);
  38. }
  39. printf("};\n");
  40. printf("#endif // PNG_%s_H_\n", name);
  41. return 0;
  42. }