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.

187 lines
4.0 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2014 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. #include <lol/engine-internal.h>
  11. #include <cstdlib>
  12. #include <cstdio>
  13. #include <cstring>
  14. #if defined(_WIN32) && !defined(_XBOX)
  15. # define WIN32_LEAN_AND_MEAN
  16. # include <windows.h>
  17. # if defined USE_D3D9
  18. # define FAR
  19. # define NEAR
  20. # include <d3d9.h>
  21. # endif
  22. #endif
  23. #include "textureimage-private.h"
  24. namespace lol
  25. {
  26. /*
  27. * TileSet implementation class
  28. */
  29. TextureImageData* TextureImage::GetNewData()
  30. {
  31. return new TextureImageData();
  32. }
  33. /*
  34. * Public TextureImage class
  35. */
  36. TextureImage::TextureImage(char const *path)
  37. : m_data(GetNewData())
  38. {
  39. Init(path);
  40. }
  41. TextureImage::TextureImage(char const *path, Image* image)
  42. : m_data(GetNewData())
  43. {
  44. Init(path, image);
  45. }
  46. TextureImage::~TextureImage()
  47. {
  48. delete m_data;
  49. }
  50. void TextureImage::Init(char const *path)
  51. {
  52. Init(path, new Image(path));
  53. }
  54. void TextureImage::Init(char const *path, Image* image)
  55. {
  56. m_data->m_name = String("<textureimage> ") + path;
  57. m_data->m_texture = nullptr;
  58. m_data->m_image = image;
  59. m_data->m_image_size = m_data->m_image->GetSize();
  60. m_data->m_texture_size = ivec2(PotUp(m_data->m_image_size.x),
  61. PotUp(m_data->m_image_size.y));
  62. m_drawgroup = DRAWGROUP_TEXTURE;
  63. }
  64. void TextureImage::TickDraw(float seconds, Scene &scene)
  65. {
  66. super::TickDraw(seconds, scene);
  67. if (IsDestroying())
  68. {
  69. if (m_data->m_image)
  70. {
  71. delete m_data->m_image;
  72. m_data->m_image = nullptr;
  73. }
  74. else
  75. {
  76. delete m_data->m_texture;
  77. m_data->m_texture = nullptr;
  78. }
  79. }
  80. else if (m_data->m_image)
  81. {
  82. //Update texture is needed
  83. if (m_data->m_texture)
  84. {
  85. delete m_data->m_texture;
  86. m_data->m_texture = nullptr;
  87. }
  88. PixelFormat format = m_data->m_image->GetFormat();
  89. int planes = BytesPerPixel(format);
  90. int w = m_data->m_texture_size.x;
  91. int h = m_data->m_texture_size.y;
  92. uint8_t *pixels = (uint8_t *)m_data->m_image->Lock();
  93. bool resized = false;
  94. if (w != m_data->m_image_size.x || h != m_data->m_image_size.y)
  95. {
  96. uint8_t *tmp = new uint8_t[planes * w * h];
  97. for (int line = 0; line < m_data->m_image_size.y; line++)
  98. memcpy(tmp + planes * w * line,
  99. pixels + planes * m_data->m_image_size.x * line,
  100. planes * m_data->m_image_size.x);
  101. pixels = tmp;
  102. resized = false;
  103. }
  104. m_data->m_texture = new Texture(ivec2(w, h), format);
  105. m_data->m_texture->SetData(pixels);
  106. if (resized)
  107. delete[] pixels;
  108. delete m_data->m_image;
  109. m_data->m_image = nullptr;
  110. }
  111. }
  112. //-----------------------------------------------------------------------------
  113. char const *TextureImage::GetName()
  114. {
  115. return m_data->m_name.C();
  116. }
  117. void TextureImage::UpdateTexture(Image* image)
  118. {
  119. m_data->m_image = image;
  120. m_data->m_image_size = m_data->m_image->GetSize();
  121. m_data->m_texture_size = ivec2(PotUp(m_data->m_image_size.x),
  122. PotUp(m_data->m_image_size.y));
  123. }
  124. Texture * TextureImage::GetTexture()
  125. {
  126. return m_data->m_texture;
  127. }
  128. Texture const * TextureImage::GetTexture() const
  129. {
  130. return m_data->m_texture;
  131. }
  132. Image * TextureImage::GetImage()
  133. {
  134. return m_data->m_image;
  135. }
  136. Image const * TextureImage::GetImage() const
  137. {
  138. return m_data->m_image;
  139. }
  140. ivec2 TextureImage::GetTextureSize() const
  141. {
  142. return m_data->m_texture_size;
  143. }
  144. void TextureImage::Bind()
  145. {
  146. if (!m_data->m_image && m_data->m_texture)
  147. m_data->m_texture->Bind();
  148. }
  149. void TextureImage::Unbind()
  150. {
  151. ;
  152. }
  153. } /* namespace lol */