4jcraft/targets/minecraft/client/renderer/texture/TextureHolder.cpp

70 lines
2 KiB
C++

#include "TextureHolder.h"
#include <algorithm>
#include "Stitcher.h"
#include "Texture.h"
#include "util/StringHelpers.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 / std::min(width, height);
}
//@Override
std::string TextureHolder::toString() {
return "TextureHolder{width=" + toWString(width) + ", height=" +
toWString(height) + '}';
}
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;
}