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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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://sam.zoy.org/projects/COPYING.WTFPL 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. #include "image.h"
  17. namespace lol
  18. {
  19. class ImageLoader
  20. {
  21. friend class Image;
  22. friend class ImageData;
  23. public:
  24. ImageData *(*fun)(char const *path);
  25. ImageLoader *next;
  26. int priority;
  27. static void RegisterLoader(ImageLoader *loader)
  28. {
  29. Helper(loader);
  30. }
  31. private:
  32. static ImageData *Load(char const *path)
  33. {
  34. ImageLoader *parser = Helper(NULL);
  35. ImageData *ret = NULL;
  36. while (parser && !ret)
  37. {
  38. ret = parser->fun(path);
  39. parser = parser->next;
  40. }
  41. return ret;
  42. }
  43. static ImageLoader *Helper(ImageLoader *set)
  44. {
  45. static ImageLoader *loaders = NULL;
  46. if (!set)
  47. return loaders;
  48. ImageLoader **parser = &loaders;
  49. while (*parser && (*parser)->priority > set->priority)
  50. parser = &(*parser)->next;
  51. set->next = *parser;
  52. *parser = set;
  53. return NULL;
  54. }
  55. };
  56. class ImageData
  57. {
  58. friend class Image;
  59. public:
  60. virtual ~ImageData() {}
  61. virtual bool Open(char const *) = 0;
  62. virtual bool Close() = 0;
  63. virtual void *GetData() const = 0;
  64. protected:
  65. ivec2 size;
  66. Image::format_t format;
  67. };
  68. #define REGISTER_IMAGE_LOADER(name) \
  69. extern void Register##name(); \
  70. Register##name();
  71. #define DECLARE_IMAGE_LOADER(name, prio) \
  72. template<typename T> class name##ImageLoader : public ImageLoader \
  73. { \
  74. public: \
  75. name##ImageLoader() \
  76. { \
  77. static ImageLoader loader; \
  78. loader.fun = Load; \
  79. loader.priority = prio; \
  80. RegisterLoader(&loader); \
  81. } \
  82. static ImageData *Load(char const *path) \
  83. { \
  84. T *ret = new T(); \
  85. if (!ret->Open(path)) \
  86. { \
  87. delete ret; \
  88. return NULL; \
  89. } \
  90. return ret; \
  91. } \
  92. }; \
  93. class name; \
  94. name##ImageLoader<name> name##ImageLoaderInstance; \
  95. void Register##name() \
  96. { \
  97. (void)&name##ImageLoaderInstance; \
  98. } \
  99. class name : public ImageData
  100. } /* namespace lol */
  101. #endif // __LOL_IMAGE_PRIVATE_H__