You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

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