graphics-magick.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "graphics.h"
  2. #include "obsconfig.h"
  3. #define MAGICKCORE_QUANTUM_DEPTH 16
  4. #define MAGICKCORE_HDRI_ENABLE 0
  5. #if LIBOBS_IMAGEMAGICK_DIR_STYLE == LIBOBS_IMAGEMAGICK_DIR_STYLE_6L
  6. #include <magick/MagickCore.h>
  7. #elif LIBOBS_IMAGEMAGICK_DIR_STYLE == LIBOBS_IMAGEMAGICK_DIR_STYLE_7GE
  8. #include <MagickCore/MagickCore.h>
  9. #endif
  10. void gs_init_image_deps()
  11. {
  12. MagickCoreGenesis(NULL, MagickTrue);
  13. }
  14. void gs_free_image_deps()
  15. {
  16. MagickCoreTerminus();
  17. }
  18. uint8_t *gs_create_texture_file_data(const char *file, enum gs_color_format *format, uint32_t *cx_out, uint32_t *cy_out)
  19. {
  20. uint8_t *data = NULL;
  21. ImageInfo *info;
  22. ExceptionInfo *exception;
  23. Image *image;
  24. if (!file || !*file)
  25. return NULL;
  26. info = CloneImageInfo(NULL);
  27. exception = AcquireExceptionInfo();
  28. strcpy(info->filename, file);
  29. image = ReadImage(info, exception);
  30. if (image) {
  31. size_t cx = image->magick_columns;
  32. size_t cy = image->magick_rows;
  33. data = bmalloc(cx * cy * 4);
  34. ExportImagePixels(image, 0, 0, cx, cy, "BGRA", CharPixel, data, exception);
  35. if (exception->severity != UndefinedException) {
  36. blog(LOG_WARNING,
  37. "magickcore warning/error getting "
  38. "pixels from file '%s': %s",
  39. file, exception->reason);
  40. bfree(data);
  41. data = NULL;
  42. }
  43. *format = GS_BGRA;
  44. *cx_out = (uint32_t)cx;
  45. *cy_out = (uint32_t)cy;
  46. DestroyImage(image);
  47. } else if (exception->severity != UndefinedException) {
  48. blog(LOG_WARNING,
  49. "magickcore warning/error reading file "
  50. "'%s': %s",
  51. file, exception->reason);
  52. }
  53. DestroyImageInfo(info);
  54. DestroyExceptionInfo(exception);
  55. return data;
  56. }