summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouist103 <35883445+louist103@users.noreply.github.com>2023-05-01 19:04:29 -0400
committerGitHub <noreply@github.com>2023-05-01 19:04:29 -0400
commit8019b35c1057da278c83a43b32ce97b769100009 (patch)
treefe1fccdf15af39c893d76308e86e9f0324cddc52
parentc30cb187bdb3d105c6e5df061fc6f121b2c84529 (diff)
Fix texture exporting. (#269)
* IA4 and IA8s * The rest of the formats. * Fix copies
-rw-r--r--ZAPD/CRC32.h2
-rw-r--r--ZAPD/ZTexture.cpp57
2 files changed, 33 insertions, 26 deletions
diff --git a/ZAPD/CRC32.h b/ZAPD/CRC32.h
index 4158a55..1f82c75 100644
--- a/ZAPD/CRC32.h
+++ b/ZAPD/CRC32.h
@@ -1,6 +1,6 @@
#pragma once
-static uint32_t CRC32B(unsigned char* message, int32_t size)
+static uint32_t CRC32B(const unsigned char* message, int32_t size)
{
int32_t byte, crc;
int32_t mask;
diff --git a/ZAPD/ZTexture.cpp b/ZAPD/ZTexture.cpp
index 43b4ffd..8207dec 100644
--- a/ZAPD/ZTexture.cpp
+++ b/ZAPD/ZTexture.cpp
@@ -215,7 +215,7 @@ void ZTexture::ParseRawDataLate()
void ZTexture::PrepareBitmapRGBA16()
{
textureData.InitEmptyRGBImage(width, height, true);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
@@ -227,7 +227,8 @@ void ZTexture::PrepareBitmapRGBA16()
uint8_t b = (data & 0x003E) >> 1;
uint8_t alpha = data & 0x01;
- textureData.SetRGBPixel(y, x, r * 8, g * 8, b * 8, alpha * 255);
+ textureData.SetRGBPixel(y, x, (r << 3) | (r >> 2), (g << 3) | (g >> 2), (b << 3) | (b >> 2),
+ alpha * 255);
}
}
}
@@ -235,7 +236,7 @@ void ZTexture::PrepareBitmapRGBA16()
void ZTexture::PrepareBitmapRGBA32()
{
textureData.InitEmptyRGBImage(width, height, true);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
@@ -254,7 +255,7 @@ void ZTexture::PrepareBitmapRGBA32()
void ZTexture::PrepareBitmapGrayscale4()
{
textureData.InitEmptyRGBImage(width, height, false);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x += 2)
@@ -269,7 +270,7 @@ void ZTexture::PrepareBitmapGrayscale4()
else
grayscale = (parentRawData.at(pos) & 0x0F) << 4;
- textureData.SetGrayscalePixel(y, x + i, grayscale);
+ textureData.SetGrayscalePixel(y, x + i, (grayscale << 4) | grayscale);
}
}
}
@@ -278,7 +279,7 @@ void ZTexture::PrepareBitmapGrayscale4()
void ZTexture::PrepareBitmapGrayscale8()
{
textureData.InitEmptyRGBImage(width, height, false);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
@@ -293,7 +294,7 @@ void ZTexture::PrepareBitmapGrayscale8()
void ZTexture::PrepareBitmapGrayscaleAlpha4()
{
textureData.InitEmptyRGBImage(width, height, true);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x += 2)
@@ -308,8 +309,9 @@ void ZTexture::PrepareBitmapGrayscaleAlpha4()
else
data = parentRawData.at(pos) & 0x0F;
- uint8_t grayscale = ((data & 0x0E) >> 1) * 32;
- uint8_t alpha = (data & 0x01) * 255;
+ uint8_t grayscale = data & 0b1110;
+ grayscale = (grayscale << 4) | (grayscale << 1) | (grayscale >> 2);
+ uint8_t alpha = (data & 0x01) ? 255 : 0;
textureData.SetGrayscalePixel(y, x + i, grayscale, alpha);
}
@@ -320,14 +322,19 @@ void ZTexture::PrepareBitmapGrayscaleAlpha4()
void ZTexture::PrepareBitmapGrayscaleAlpha8()
{
textureData.InitEmptyRGBImage(width, height, true);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
{
size_t pos = rawDataIndex + ((y * width) + x) * 1;
- uint8_t grayscale = parentRawData.at(pos) & 0xF0;
- uint8_t alpha = (parentRawData.at(pos) & 0x0F) << 4;
+ uint8_t pixel = parentRawData.at(pos);
+ uint8_t data = (pixel >> 4) & 0xF;
+
+ data = (data << 4) | data;
+ uint8_t grayscale = data;
+ uint8_t alpha = (pixel & 0xF);
+ alpha = (alpha << 4) | alpha;
textureData.SetGrayscalePixel(y, x, grayscale, alpha);
}
@@ -337,7 +344,7 @@ void ZTexture::PrepareBitmapGrayscaleAlpha8()
void ZTexture::PrepareBitmapGrayscaleAlpha16()
{
textureData.InitEmptyRGBImage(width, height, true);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
@@ -354,7 +361,7 @@ void ZTexture::PrepareBitmapGrayscaleAlpha16()
void ZTexture::PrepareBitmapPalette4()
{
textureData.InitEmptyPaletteImage(width, height);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x += 2)
@@ -378,7 +385,7 @@ void ZTexture::PrepareBitmapPalette4()
void ZTexture::PrepareBitmapPalette8()
{
textureData.InitEmptyPaletteImage(width, height);
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
for (size_t y = 0; y < height; y++)
{
for (size_t x = 0; x < width; x++)
@@ -469,13 +476,13 @@ void ZTexture::PrepareRawDataRGBA16()
size_t pos = ((y * width) + x) * 2;
RGBAPixel pixel = textureData.GetPixel(y, x);
- uint8_t r = pixel.r / 8;
- uint8_t g = pixel.g / 8;
- uint8_t b = pixel.b / 8;
+ uint8_t r = pixel.r >> 3;
+ uint8_t g = pixel.g >> 3;
+ uint8_t b = pixel.b >> 3;
uint8_t alphaBit = pixel.a != 0;
- uint16_t data = (r << 11) + (g << 6) + (b << 1) + alphaBit;
+ uint16_t data = (r << 11) | (g << 6) | (b << 1) | alphaBit;
textureDataRaw[pos + 0] = (data & 0xFF00) >> 8;
textureDataRaw[pos + 1] = (data & 0x00FF);
@@ -544,9 +551,9 @@ void ZTexture::PrepareRawDataGrayscaleAlpha4()
uint8_t alphaBit = pixel.a != 0;
if (i == 0)
- data |= (((cR / 32) << 1) + alphaBit) << 4;
+ data = (((cR >> 5) << 1) | alphaBit) << 4;
else
- data |= ((cR / 32) << 1) + alphaBit;
+ data |= ((cR >> 5) << 1) | alphaBit;
}
textureDataRaw[pos] = data;
@@ -563,10 +570,10 @@ void ZTexture::PrepareRawDataGrayscaleAlpha8()
size_t pos = ((y * width) + x) * 1;
RGBAPixel pixel = textureData.GetPixel(y, x);
- uint8_t r = pixel.r;
- uint8_t a = pixel.a;
+ uint8_t r = (pixel.r >> 4) &0xF;
+ uint8_t a = (pixel.a >> 4) &0xF;
- textureDataRaw[pos] = ((r / 16) << 4) + (a / 16);
+ textureDataRaw[pos] = (r << 4) | a;
}
}
}
@@ -844,7 +851,7 @@ std::string ZTexture::GetSourceTypeName() const
void ZTexture::CalcHash()
{
- auto parentRawData = parent->GetRawData();
+ const auto& parentRawData = parent->GetRawData();
hash = CRC32B(parentRawData.data() + rawDataIndex, GetRawDataSize());
}