aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/TextureHolder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/TextureHolder.cpp')
-rw-r--r--Minecraft.Client/TextureHolder.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/Minecraft.Client/TextureHolder.cpp b/Minecraft.Client/TextureHolder.cpp
new file mode 100644
index 00000000..9cbf5c46
--- /dev/null
+++ b/Minecraft.Client/TextureHolder.cpp
@@ -0,0 +1,84 @@
+#include "stdafx.h"
+#include "Stitcher.h"
+#include "Texture.h"
+#include "..\Minecraft.World\StringHelpers.h"
+#include "TextureHolder.h"
+
+TextureHolder::TextureHolder(Texture *texture)
+{
+ scale = 1.0f;
+
+ this->texture = texture;
+ this->width = texture->getWidth();
+ this->height = texture->getHeight();
+
+ this->rotated = smallestFittingMinTexel(height) > smallestFittingMinTexel(width);
+}
+
+Texture *TextureHolder::getTexture()
+{
+ return texture;
+}
+
+int TextureHolder::getWidth() const
+{
+ return rotated ? smallestFittingMinTexel((int) (height * scale)) : smallestFittingMinTexel((int) (width * scale));
+}
+
+int TextureHolder::getHeight() const
+{
+ return rotated ? smallestFittingMinTexel((int) (width * scale)) : smallestFittingMinTexel((int) (height * scale));
+}
+
+void TextureHolder::rotate()
+{
+ rotated = !rotated;
+}
+
+bool TextureHolder::isRotated()
+{
+ return rotated;
+}
+
+int TextureHolder::smallestFittingMinTexel(int input) const
+{
+ return ((input >> Stitcher::MAX_MIPLEVEL) + ((input & (Stitcher::MIN_TEXEL - 1)) == 0 ? 0 : 1)) << Stitcher::MAX_MIPLEVEL;
+}
+
+void TextureHolder::setForcedScale(int targetSize)
+{
+ if (width <= targetSize || height <= targetSize)
+ {
+ return;
+ }
+
+ scale = (float) targetSize / min(width, height);
+}
+
+//@Override
+wstring TextureHolder::toString()
+{
+ return L"TextureHolder{width=" + _toString(width) + L", height=" + _toString(height) + L'}';
+}
+
+int TextureHolder::compareTo(const TextureHolder *other) const
+{
+ int result = 0;
+ if (this->getHeight() == other->getHeight())
+ {
+ if (this->getWidth() == other->getWidth())
+ {
+ if (texture->getName().empty())
+ {
+ return other->texture->getName().empty() ? 0 : -1;
+ }
+ return texture->getName().compare(other->texture->getName());
+ }
+ result = this->getWidth() < other->getWidth() ? 1 : -1;
+ }
+ else
+ {
+ result = this->getHeight() < other->getHeight() ? 1 : -1;
+ }
+ return result;
+} \ No newline at end of file