// This file is part of the 64k demo project. // It implements reusable test helpers for GPU effect testing. // Provides pixel validation utilities. #include "effect_test_helpers.h" #include // ============================================================================ // Pixel Validation Helpers // ============================================================================ bool validate_pixels( const std::vector& pixels, int width, int height, std::function predicate) { const size_t pixel_count = width * height; for (size_t i = 0; i < pixel_count; ++i) { const size_t offset = i * 4; // BGRA8 = 4 bytes/pixel const uint8_t b = pixels[offset + 0]; const uint8_t g = pixels[offset + 1]; const uint8_t r = pixels[offset + 2]; const uint8_t a = pixels[offset + 3]; if (predicate(r, g, b, a)) { return true; // At least one pixel matches } } return false; // No pixels matched } bool has_rendered_content(const std::vector& pixels, int width, int height) { return validate_pixels(pixels, width, height, [](uint8_t r, uint8_t g, uint8_t b, uint8_t a) { return r > 0 || g > 0 || b > 0; }); } bool all_pixels_match_color(const std::vector& pixels, int width, int height, uint8_t target_r, uint8_t target_g, uint8_t target_b, uint8_t tolerance) { const size_t pixel_count = width * height; for (size_t i = 0; i < pixel_count; ++i) { const size_t offset = i * 4; const uint8_t b = pixels[offset + 0]; const uint8_t g = pixels[offset + 1]; const uint8_t r = pixels[offset + 2]; const int diff_r = (int)(r) - (int)(target_r); const int diff_g = (int)(g) - (int)(target_g); const int diff_b = (int)(b) - (int)(target_b); if (diff_r * diff_r + diff_g * diff_g + diff_b * diff_b > tolerance * tolerance) { return false; // At least one pixel doesn't match } } return true; // All pixels match } uint64_t hash_pixels(const std::vector& pixels) { // Simple FNV-1a hash uint64_t hash = 14695981039346656037ULL; for (const uint8_t byte : pixels) { hash ^= byte; hash *= 1099511628211ULL; } return hash; }