DumpDVD/DumpDVD/Gui/DvdSpin/CdTex.cpp

86 lines
2.5 KiB
C++

#include <lzma.h>
#include <iostream>
#include "diff.hpp"
#include "ceedee_tex.h"
#include "CdTex.hpp"
#include "CdType.hpp"
namespace Li::Gui::DvdSpin {
CdTex::CdTex() {
this->uncompressedTextureSz = ceedeeImgUncompressedSz;
this->uncompressedTexture = new std::byte[this->uncompressedTextureSz];
this->SetUnknownTexture();
}
void CdTex::applyDiff(uint32_t numChanges, ImgDiff* changesList) {
uint32_t* uncompressedTextureRGBA = (uint32_t*)this->uncompressedTexture;
for (unsigned int i = 0; i < numChanges; i++) {
ImgDiff curChange = changesList[i];
uncompressedTextureRGBA[curChange.Location] = curChange.NewColor;
}
}
void CdTex::SetCdTexture() {
if (this->currentCdType == CdType::COMPACT_DISC) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeCdDiffSz, ceedeeCdDiff);
this->currentCdType = CdType::COMPACT_DISC;
}
void CdTex::SetDvdTexture() {
if (this->currentCdType == CdType::DIGITAL_VERSITLE_DISC) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeDvdDiffSz, ceedeeDvdDiff);
this->currentCdType = CdType::DIGITAL_VERSITLE_DISC;
}
void CdTex::SetHdDvdTexture() {
if (this->currentCdType == CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeHdDvdDiffSz, ceedeeHdDvdDiff);
this->currentCdType = CdType::HIGH_DEFINITION_DIGITAL_VERSITLE_DISC;
}
void CdTex::SetBdTexture() {
if (this->currentCdType == CdType::BLU_RAY) return;
if (this->currentCdType != CdType::UNKNOWN_DISC) this->SetUnknownTexture();
this->applyDiff(ceedeeBluRayDiffSz, ceedeeBluRayDiff);
this->currentCdType = CdType::BLU_RAY;
}
void CdTex::SetUnknownTexture() {
uint32_t compressedSize = ceedeeImgCompressedDataSz;
lzma2decompress((unsigned char*)&ceedeeImgCompressedData, &compressedSize, (unsigned char*)this->uncompressedTexture, &this->uncompressedTextureSz);
this->currentCdType = CdType::UNKNOWN_DISC;
}
uint32_t CdTex::Width() {
return ceedeeImgWidth;
}
uint32_t CdTex::Height() {
return ceedeeImgHeight;
}
uint32_t CdTex::Channels() {
return ceedeeImgChannels;
}
uint32_t CdTex::Pitch() {
return (this->Width() * this->Channels());
}
CdType CdTex::CurrentCdType() {
return this->currentCdType;
}
std::byte* CdTex::CurrentTexture() {
return this->uncompressedTexture;
}
CdTex::~CdTex() {
this->currentCdType = CdType::UNKNOWN_DISC;
delete this->uncompressedTexture;
}
}