Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

124 строки
2.6 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. //
  11. // The ImageData class
  12. // -------------------
  13. //
  14. #if !defined __LOL_IMAGE_PRIVATE_H__
  15. #define __LOL_IMAGE_PRIVATE_H__
  16. namespace lol
  17. {
  18. class ImageLoader
  19. {
  20. friend class Image;
  21. friend class ImageData;
  22. public:
  23. ImageData *(*fun)(char const *path);
  24. ImageLoader *next;
  25. int priority;
  26. static void RegisterLoader(ImageLoader *loader)
  27. {
  28. Helper(loader);
  29. }
  30. private:
  31. static ImageData *Load(char const *path)
  32. {
  33. ImageLoader *parser = Helper(nullptr);
  34. ImageData *ret = nullptr;
  35. while (parser && !ret)
  36. {
  37. ret = parser->fun(path);
  38. parser = parser->next;
  39. }
  40. return ret;
  41. }
  42. static ImageLoader *Helper(ImageLoader *set)
  43. {
  44. static ImageLoader *loaders = nullptr;
  45. if (!set)
  46. return loaders;
  47. ImageLoader **parser = &loaders;
  48. while (*parser && (*parser)->priority > set->priority)
  49. parser = &(*parser)->next;
  50. set->next = *parser;
  51. *parser = set;
  52. return nullptr;
  53. }
  54. };
  55. class ImageData
  56. {
  57. friend class Image;
  58. public:
  59. virtual ~ImageData() {}
  60. virtual bool Open(char const *) = 0;
  61. virtual bool Close() = 0;
  62. virtual uint8_t *GetData() const = 0;
  63. protected:
  64. ivec2 m_size;
  65. PixelFormat m_format;
  66. };
  67. #define REGISTER_IMAGE_LOADER(name) \
  68. extern void Register##name(); \
  69. Register##name();
  70. #define DECLARE_IMAGE_LOADER(name, prio) \
  71. template<typename T> class name##ImageLoader : public ImageLoader \
  72. { \
  73. public: \
  74. name##ImageLoader() \
  75. { \
  76. static ImageLoader loader; \
  77. loader.fun = Load; \
  78. loader.priority = prio; \
  79. RegisterLoader(&loader); \
  80. } \
  81. static ImageData *Load(char const *path) \
  82. { \
  83. T *ret = new T(); \
  84. if (!ret->Open(path)) \
  85. { \
  86. delete ret; \
  87. return nullptr; \
  88. } \
  89. return ret; \
  90. } \
  91. }; \
  92. class name; \
  93. name##ImageLoader<name> name##ImageLoaderInstance; \
  94. void Register##name() \
  95. { \
  96. (void)&name##ImageLoaderInstance; \
  97. } \
  98. class name : public ImageData
  99. } /* namespace lol */
  100. #endif // __LOL_IMAGE_PRIVATE_H__