From f06fc809b224fe466398924ed448028e2f309b62 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Tue, 6 Apr 2021 00:03:58 -0700 Subject: [PATCH] Add BC1 block decoding tests and fix --- quicktex/s3tc/bc1/BC1Decoder.cpp | 2 +- tests/test_bc1.py | 39 +++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/quicktex/s3tc/bc1/BC1Decoder.cpp b/quicktex/s3tc/bc1/BC1Decoder.cpp index 90ebdfb..3cd36e3 100644 --- a/quicktex/s3tc/bc1/BC1Decoder.cpp +++ b/quicktex/s3tc/bc1/BC1Decoder.cpp @@ -29,7 +29,7 @@ namespace quicktex::s3tc { -ColorBlock<4, 4> BC1Decoder::DecodeBlock(const BC1Block &block) const { return DecodeBlock(block, false); } +ColorBlock<4, 4> BC1Decoder::DecodeBlock(const BC1Block &block) const { return DecodeBlock(block, true); } ColorBlock<4, 4> BC1Decoder::DecodeBlock(const BC1Block &block, bool use_3color) const { auto output = ColorBlock<4, 4>(); diff --git a/tests/test_bc1.py b/tests/test_bc1.py index 2fff8ea..73b0415 100644 --- a/tests/test_bc1.py +++ b/tests/test_bc1.py @@ -1,8 +1,9 @@ import unittest import nose -from parameterized import parameterized_class -from quicktex.s3tc.bc1 import BC1Block, BC1Texture, BC1Encoder +from parameterized import parameterized, parameterized_class +from quicktex.s3tc.bc1 import BC1Block, BC1Texture, BC1Encoder, BC1Decoder from tests.images import BC1Blocks +from PIL import Image, ImageChops in_endpoints = ((253, 254, 255), (65, 70, 67)) # has some small changes that should encode the same out_endpoints = ((255, 255, 255, 255), (66, 69, 66, 255)) @@ -124,14 +125,14 @@ class TestBC1Texture(unittest.TestCase): ("3Color_Black", BC1Encoder.ColorMode.ThreeColorBlack), ]) class TestBC1Encoder(unittest.TestCase): - """Test BC1 encoder with a variety of inputs with 3 color blocks disabled.""" + """Test BC1Encoder""" @classmethod def setUpClass(cls): cls.bc1_encoder = BC1Encoder(5, cls.color_mode) def test_block_4color(self): - """Test encoder output with 4 color greyscale testblock.""" + """Test encoder output with 4 color greyscale test block""" out_tex = self.bc1_encoder.encode(BC1Blocks.greyscale.texture) self.assertEqual(out_tex.dimensions_blocks, (1, 1), 'encoded texture has multiple blocks') @@ -142,7 +143,7 @@ class TestBC1Encoder(unittest.TestCase): self.assertEqual(out_block, BC1Blocks.greyscale.block, 'encoded block is incorrect') def test_block_3color(self): - """Test encoder output with 3 color test block.""" + """Test encoder output with 3 color test block""" out_tex = self.bc1_encoder.encode(BC1Blocks.three_color.texture) self.assertEqual(out_tex.dimensions_blocks, (1, 1), 'encoded texture has multiple blocks') @@ -156,7 +157,7 @@ class TestBC1Encoder(unittest.TestCase): self.assertFalse(out_block.is_3color, 'returned 3-color block in 4-color mode') def test_block_3color_black(self): - """Test encoder output with 3 color test block with black pixels.""" + """Test encoder output with 3 color test block with black pixels""" out_tex = self.bc1_encoder.encode(BC1Blocks.three_color_black.texture) self.assertEqual(out_tex.dimensions_blocks, (1, 1), 'encoded texture has multiple blocks') @@ -174,5 +175,31 @@ class TestBC1Encoder(unittest.TestCase): self.assertFalse(out_block.is_3color, 'returned 3-color block in 4-color mode') +class TestBC1Decoder(unittest.TestCase): + """Test BC1Decoder""" + + @classmethod + def setUpClass(cls): + cls.bc1_decoder = BC1Decoder() + + @parameterized.expand([ + ("4color", BC1Blocks.greyscale.block, BC1Blocks.greyscale.image), + ("3color", BC1Blocks.three_color.block, BC1Blocks.three_color.image), + ("3color_black", BC1Blocks.three_color_black.block, BC1Blocks.three_color_black.image) + ]) + def test_block(self, _, block, image): + """Test decoder output for a single block""" + in_tex = BC1Texture(4, 4) + in_tex[0, 0] = block + out_tex = self.bc1_decoder.decode(in_tex) + + self.assertEqual(out_tex.dimensions, (4, 4), 'decoded texture has incorrect dimensions') + + out_img = Image.frombytes('RGBA', (4, 4), out_tex.tobytes()) + img_diff = ImageChops.difference(out_img, image).convert('L') + img_hist = img_diff.histogram() + self.assertEqual(16, img_hist[0], 'decoded block is incorrect') + + if __name__ == '__main__': nose.main()