Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added libvisual/tests/images/additive-colors-argb32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file added libvisual/tests/images/additive-colors-rgb24.bmp
Binary file not shown.
Binary file added libvisual/tests/images/additive-colors-rgb24.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added libvisual/tests/images/additive-colors-rgb24.raw
Binary file not shown.
30 changes: 30 additions & 0 deletions libvisual/tests/images/additive-colors.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions libvisual/tests/images/license.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,11 @@ Description: Geological wonder "The Painted Desert" in Arizona
Author : katsrcool
URL : http://www.flickr.com/photos/katsrcool/7275923984/
License : CC BY 2.0

additive_color.svg
------------------
Name : AdditiveColor.svg
Description: This image demonstrates the principle of additive color mixing, and is not meant as an exhibition of any particular color space. Original by Mike Horvath.
Author : SharkD at English Wikipedia
URL : https://commons.wikimedia.org/wiki/File:AdditiveColor.svg
License : CC0
4 changes: 4 additions & 0 deletions libvisual/tests/video_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ LV_BUILD_TEST(video_blit_test
SOURCES video_blit_test.cpp
)

LV_BUILD_TEST(video_load_test
SOURCES video_load_test.cpp
)

IF(HAVE_SDL)
LV_BUILD_TEST(video_scale_test
SOURCES video_scale_test.cpp
Expand Down
152 changes: 152 additions & 0 deletions libvisual/tests/video_test/video_load_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
#include "test.h"
#include <libvisual/libvisual.h>
#include <bit>
#include <filesystem>
#include <fstream>
#include <optional>

namespace
{
namespace fs = std::filesystem;

LV::VideoPtr load_raw_image (fs::path const& path, int width, int height, VisVideoDepth depth)
{
auto image {LV::Video::create (width, height, depth)};

std::size_t const content_bytes_per_row = image->get_width () * image->get_bpp ();

{
std::ifstream input {path, std::ios::binary};
if (!input) {
return nullptr;
}

for (int y = 0; y < image->get_height (); y++) {
auto pixel_row_ptr = static_cast<char*> (image->get_pixel_ptr (0, y));
if (!input.read (pixel_row_ptr, content_bytes_per_row)) {
return nullptr;
}
}
}

if constexpr (std::endian::native == std::endian::little) {
auto byteswapped_image {LV::Video::create (width, height, depth)};
byteswapped_image->flip_pixel_bytes (image);
return byteswapped_image;
} else {
return image;
}
}

std::optional<LV::Palette> load_raw_palette (fs::path const& path)
{
std::vector<std::uint8_t> palette_buffer (256 * 3);
{
std::ifstream input {path, std::ios::binary};
if (!input.read (reinterpret_cast<char*> (palette_buffer.data ()), palette_buffer.size ())) {
return std::nullopt;
}
}

LV::Palette palette;
palette.colors.reserve (256);
for (unsigned int i = 0; i < 256; i++) {
palette.colors.emplace_back (palette_buffer[i*3], palette_buffer[i*3+1], palette_buffer[i*3+2]);
}

return palette;
}

LV::VideoPtr load_raw_indexed_image (fs::path const& image_path,
fs::path const& palette_path,
int width,
int height)
{
auto image {LV::Video::create (width, height, VISUAL_VIDEO_DEPTH_8BIT)};

std::size_t const content_bytes_per_row = image->get_width () * image->get_bpp ();

{
std::ifstream input {image_path, std::ios::binary};
if (!input) {
return nullptr;
}

for (int y = 0; y < image->get_height (); y++) {
auto pixel_row_ptr = static_cast<char*> (image->get_pixel_ptr (0, y));
if (!input.read (pixel_row_ptr, content_bytes_per_row)) {
return nullptr;
}
}
}

auto palette {load_raw_palette (palette_path)};
if (!palette.has_value ()) {
return nullptr;
}
image->set_palette (palette.value ());

return image;
}

void test_load_indexed8 ()
{
auto bmp_image {LV::Video::create_from_file ("../images/additive-colors-indexed8.bmp")};
LV_TEST_ASSERT (bmp_image);

auto png_image {LV::Video::create_from_file ("../images/additive-colors-indexed8.png")};
LV_TEST_ASSERT (png_image);

auto raw_image {load_raw_indexed_image ("../images/additive-colors-indexed8.raw",
"../images/additive-colors-indexed8.raw.pal",
png_image->get_width (),
png_image->get_height ())};

auto raw_image_rgb24 {LV::Video::create (raw_image->get_width (), raw_image->get_height (), VISUAL_VIDEO_DEPTH_24BIT)};
raw_image_rgb24->convert_depth (raw_image);

LV_TEST_ASSERT (bmp_image->has_same_content (raw_image));
LV_TEST_ASSERT (png_image->has_same_content (raw_image_rgb24));
}

void test_load_rgb24 ()
{
auto bmp_image {LV::Video::create_from_file ("../images/additive-colors-rgb24.bmp")};
LV_TEST_ASSERT (bmp_image);

auto png_image {LV::Video::create_from_file ("../images/additive-colors-rgb24.png")};
LV_TEST_ASSERT (png_image);

auto raw_image {load_raw_image ("../images/additive-colors-rgb24.raw",
png_image->get_width (),
png_image->get_height (),
VISUAL_VIDEO_DEPTH_24BIT)};

LV_TEST_ASSERT (bmp_image->has_same_content (raw_image));
LV_TEST_ASSERT (png_image->has_same_content (raw_image));
}

void test_load_argb32 ()
{
auto png_image {LV::Video::create_from_file ("../images/additive-colors-argb32.png")};
LV_TEST_ASSERT (png_image);

auto raw_image {load_raw_image ("../images/additive-colors-argb32.raw",
png_image->get_width (),
png_image->get_height (),
VISUAL_VIDEO_DEPTH_32BIT)};

LV_TEST_ASSERT (png_image->has_same_content (raw_image));
}
}

int main (int argc, char* argv[])
{
LV::System::init (argc, argv);

test_load_indexed8 ();
test_load_rgb24 ();
test_load_argb32 ();

LV::System::destroy ();
}