ImageScaled.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. Point ImageScaled::dimensions() const
  52. {
  53. return source->dimensions();
  54. }
  55. void ImageScaled::setAlpha(uint8_t value)
  56. {
  57. alphaValue = value;
  58. }
  59. void ImageScaled::setBlitMode(EImageBlitMode mode)
  60. {
  61. blitMode = mode;
  62. }
  63. void ImageScaled::draw(SDL_Surface *where, const Point &pos, const Rect *src) const
  64. {
  65. if (shadow)
  66. shadow->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
  67. if (body)
  68. body->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
  69. if (overlay)
  70. overlay->draw(where, nullptr, pos, src, colorMultiplier, colorMultiplier.a * alphaValue / 255, blitMode);
  71. }
  72. void ImageScaled::setOverlayColor(const ColorRGBA & color)
  73. {
  74. colorMultiplier = color;
  75. }
  76. void ImageScaled::playerColored(PlayerColor player)
  77. {
  78. playerColor = player;
  79. prepareImages();
  80. }
  81. void ImageScaled::shiftPalette(uint32_t firstColorID, uint32_t colorsToMove, uint32_t distanceToMove)
  82. {
  83. // TODO: implement
  84. }
  85. void ImageScaled::adjustPalette(const ColorFilter &shifter, uint32_t colorsToSkipMask)
  86. {
  87. // TODO: implement
  88. }
  89. void ImageScaled::prepareImages()
  90. {
  91. switch(blitMode)
  92. {
  93. case EImageBlitMode::OPAQUE:
  94. case EImageBlitMode::COLORKEY:
  95. case EImageBlitMode::SIMPLE:
  96. locator.layer = blitMode;
  97. locator.playerColored = playerColor;
  98. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  99. break;
  100. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  101. case EImageBlitMode::ONLY_BODY:
  102. locator.layer = EImageBlitMode::ONLY_BODY;
  103. locator.playerColored = playerColor;
  104. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  105. break;
  106. case EImageBlitMode::WITH_SHADOW:
  107. case EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY:
  108. locator.layer = EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY;
  109. locator.playerColored = playerColor;
  110. body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  111. break;
  112. case EImageBlitMode::ONLY_SHADOW:
  113. case EImageBlitMode::ONLY_OVERLAY:
  114. body = nullptr;
  115. break;
  116. }
  117. switch(blitMode)
  118. {
  119. case EImageBlitMode::WITH_SHADOW:
  120. case EImageBlitMode::ONLY_SHADOW:
  121. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  122. locator.layer = EImageBlitMode::ONLY_SHADOW;
  123. locator.playerColored = PlayerColor::CANNOT_DETERMINE;
  124. shadow = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  125. break;
  126. default:
  127. shadow = nullptr;
  128. break;
  129. }
  130. switch(blitMode)
  131. {
  132. case EImageBlitMode::ONLY_OVERLAY:
  133. case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
  134. locator.layer = EImageBlitMode::ONLY_OVERLAY;
  135. locator.playerColored = PlayerColor::CANNOT_DETERMINE;
  136. overlay = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
  137. break;
  138. default:
  139. overlay = nullptr;
  140. break;
  141. }
  142. }