graphics-magick.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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,
  19. enum gs_color_format *format,
  20. uint32_t *cx_out, uint32_t *cy_out)
  21. {
  22. uint8_t *data = NULL;
  23. ImageInfo *info;
  24. ExceptionInfo *exception;
  25. Image *image;
  26. if (!file || !*file)
  27. return NULL;
  28. info = CloneImageInfo(NULL);
  29. exception = AcquireExceptionInfo();
  30. strcpy(info->filename, file);
  31. image = ReadImage(info, exception);
  32. if (image) {
  33. size_t cx = image->magick_columns;
  34. size_t cy = image->magick_rows;
  35. data = bmalloc(cx * cy * 4);
  36. ExportImagePixels(image, 0, 0, cx, cy, "BGRA", CharPixel, data,
  37. exception);
  38. if (exception->severity != UndefinedException) {
  39. blog(LOG_WARNING,
  40. "magickcore warning/error getting "
  41. "pixels from file '%s': %s",
  42. file, exception->reason);
  43. bfree(data);
  44. data = NULL;
  45. }
  46. *format = GS_BGRA;
  47. *cx_out = (uint32_t)cx;
  48. *cy_out = (uint32_t)cy;
  49. DestroyImage(image);
  50. } else if (exception->severity != UndefinedException) {
  51. blog(LOG_WARNING,
  52. "magickcore warning/error reading file "
  53. "'%s': %s",
  54. file, exception->reason);
  55. }
  56. DestroyImageInfo(info);
  57. DestroyExceptionInfo(exception);
  58. return data;
  59. }