ImageScaled.cpp 4.0 KB

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