ImageScaled.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * ImageScaled.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "ImageScaled.h"
  12. #include "SDLImage.h"
  13. #include "SDL_Extensions.h"
  14. #include "../gui/CGuiHandler.h"
  15. #include "../render/IScreenHandler.h"
  16. #include "../render/Colors.h"
  17. #include "../../lib/constants/EntityIdentifiers.h"
  18. #include <SDL_surface.h>
  19. ImageScaled::ImageScaled(const ImageLocator & inputLocator, const std::shared_ptr<const ISharedImage> & source, EImageBlitMode mode)
  20. : source(source)
  21. , locator(inputLocator)
  22. , colorMultiplier(Colors::WHITE_TRUE)
  23. , alphaValue(SDL_ALPHA_OPAQUE)
  24. , blitMode(mode)
  25. {
  26. prepareImages();
  27. }
  28. std::shared_ptr<const ISharedImage> ImageScaled::getSharedImage() const
  29. {
  30. return body;
  31. }
  32. void ImageScaled::scaleInteger(int factor)
  33. {
  34. assert(0);
  35. }
  36. void ImageScaled::scaleTo(const Point & size)
  37. {
  38. if (source)
  39. source = source->scaleTo(size, nullptr);
  40. if (body)
  41. body = body->scaleTo(size * GH.screenHandler().getScalingFactor(), nullptr);
  42. }
  43. void ImageScaled::exportBitmap(const boost::filesystem::path &path) const
  44. {
  45. source->exportBitmap(path, nullptr);
  46. }
  47. bool ImageScaled::isTransparent(const Point &coords) const
  48. {
  49. return source->isTransparent(coords);
  50. }
  51. Rect ImageScaled::contentRect() const
  52. {
  53. return source->contentRect();
  54. }
  55. Point ImageScaled::dimensions() const
  56. {
  57. return source->dimensions();
  58. }
  59. void ImageScaled::setAlpha(uint8_t value)
  60. {
  61. alphaValue = value;
  62. }
  63. void ImageScaled::setBlitMode(EImageBlitMode mode)
  64. {
  65. blitMode = mode;
  66. }
  67. void ImageScaled::draw(SDL_Surface *where, const Point &pos, const Rect *src) const
  68. {
  69. if (shadow)
  70. shadow->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
  71. if (body)
  72. body->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
  73. if (overlay)
  74. overlay->draw(where, nullptr, pos, src, colorMultiplier, colorMultiplier.a * alphaValue / 255, blitMode);
  75. }
  76. void ImageScaled::setOverlayColor(const ColorRGBA & color)
  77. {
  78. colorMultiplier = color;
  79. }
  80. void ImageScaled::playerColored(PlayerColor player)
  81. {
  82. playerColor = player;
  83. prepareImages();
  84. }
  85. void ImageScaled::shiftPalette(uint32_t firstColorID, uint32_t colorsToMove, uint32_t distanceToMove)
  86. {
  87. // TODO: implement
  88. }
  89. void ImageScaled::adjustPalette(const ColorFilter &shifter, uint32_t colorsToSkipMask)
  90. {
  91. // TODO: implement
  92. }
  93. void ImageScaled::prepareImages()
  94. {
  95. switch(blitMode)
  96. {
  97. case EImageBlitMode::OPAQUE:
  98. case EImageBlitMode::COLORKEY:
  99. case EImageBlitMode::SIMPLE:
  100. locator.layer = blitMode;
  101. locator.playerColored = playerColor;
  102. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  103. break;
  104. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  105. case EImageBlitMode::ONLY_BODY:
  106. locator.layer = EImageBlitMode::ONLY_BODY;
  107. locator.playerColored = playerColor;
  108. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  109. break;
  110. case EImageBlitMode::WITH_SHADOW:
  111. case EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY:
  112. locator.layer = EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY;
  113. locator.playerColored = playerColor;
  114. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  115. break;
  116. case EImageBlitMode::ONLY_SHADOW:
  117. case EImageBlitMode::ONLY_OVERLAY:
  118. body = nullptr;
  119. break;
  120. }
  121. switch(blitMode)
  122. {
  123. case EImageBlitMode::WITH_SHADOW:
  124. case EImageBlitMode::ONLY_SHADOW:
  125. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  126. locator.layer = EImageBlitMode::ONLY_SHADOW;
  127. locator.playerColored = PlayerColor::CANNOT_DETERMINE;
  128. shadow = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  129. break;
  130. default:
  131. shadow = nullptr;
  132. break;
  133. }
  134. switch(blitMode)
  135. {
  136. case EImageBlitMode::ONLY_OVERLAY:
  137. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  138. locator.layer = EImageBlitMode::ONLY_OVERLAY;
  139. locator.playerColored = PlayerColor::CANNOT_DETERMINE;
  140. overlay = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  141. break;
  142. default:
  143. overlay = nullptr;
  144. break;
  145. }
  146. }