yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
visual_diff_engine.h
Go to the documentation of this file.
1#ifndef YAZE_APP_TEST_VISUAL_DIFF_ENGINE_H_
2#define YAZE_APP_TEST_VISUAL_DIFF_ENGINE_H_
3
4#include <cstdint>
5#include <string>
6#include <vector>
7
8#include "absl/status/status.h"
9#include "absl/status/statusor.h"
11
12namespace yaze {
13namespace test {
14
21 bool identical = false; // True if images are pixel-perfect identical
22 bool passed = false; // True if similarity >= tolerance
23 float similarity = 0.0f; // 0.0 to 1.0 (1.0 = identical)
24 float difference_pct = 0.0f; // Percentage of differing pixels
25
26 // Image dimensions
27 int width = 0;
28 int height = 0;
29 int total_pixels = 0;
31
32 // Diff visualization
33 std::vector<uint8_t> diff_image_png; // PNG-encoded diff image
34 std::string diff_description; // Human-readable description
35
36 // Regions of interest
37 struct DiffRegion {
38 int x = 0;
39 int y = 0;
40 int width = 0;
41 int height = 0;
42 float local_diff_pct = 0.0f; // Diff percentage in this region
43 };
44 std::vector<DiffRegion> significant_regions;
45
46 // Error info
47 std::string error_message;
48
52 std::string Format() const;
53
57 std::string ToJson() const;
58};
59
64 // Similarity threshold (0.0 to 1.0)
65 float tolerance = 0.95f; // 95% similarity = pass
66
67 // Per-pixel color tolerance (RGB channels)
68 int color_threshold = 10; // Max RGB difference per channel (0-255)
69
70 // Diff image generation
72 enum class DiffStyle {
73 kRedHighlight, // Red overlay on different pixels
74 kSideBySide, // A | diff | B side by side
75 kHeatmap, // Gradient showing degree of difference
76 kBlinkComposite, // Alternating frames (for animated output)
77 };
79
80 // Comparison algorithm
81 enum class Algorithm {
82 kPixelExact, // Exact pixel comparison
83 kSSIM, // Structural Similarity Index
84 kPerceptualHash, // pHash for similarity
85 };
87
88 // Region detection
89 int region_merge_distance = 16; // Merge nearby diff regions (pixels)
90 int min_region_size = 4; // Minimum region size to report (pixels)
91
92 // Ignore regions (for dynamic content)
93 std::vector<ScreenRegion> ignore_regions;
94};
95
124 public:
126 explicit VisualDiffEngine(const VisualDiffConfig& config);
127 ~VisualDiffEngine() = default;
128
129 // Configuration
130 void SetConfig(const VisualDiffConfig& config) { config_ = config; }
131 const VisualDiffConfig& GetConfig() const { return config_; }
132 void SetTolerance(float tolerance) { config_.tolerance = tolerance; }
133
134 // --- Core Comparison Methods ---
135
143 absl::StatusOr<VisualDiffResult> ComparePngFiles(const std::string& path_a,
144 const std::string& path_b);
145
153 absl::StatusOr<VisualDiffResult> ComparePngData(
154 const std::vector<uint8_t>& png_a, const std::vector<uint8_t>& png_b);
155
163 absl::StatusOr<VisualDiffResult> CompareWithReference(
164 const std::vector<uint8_t>& png_data, const std::string& reference_path);
165
174
175 // --- Region Comparison ---
176
185 absl::StatusOr<VisualDiffResult> CompareRegion(
186 const std::vector<uint8_t>& png_a, const std::vector<uint8_t>& png_b,
187 const ScreenRegion& region);
188
189 // --- Diff Image Generation ---
190
198 absl::StatusOr<std::vector<uint8_t>> GenerateDiffPng(const Screenshot& a,
199 const Screenshot& b);
200
208 absl::Status SaveDiffImage(const VisualDiffResult& result,
209 const std::string& output_path);
210
211 // --- Utility Methods ---
212
219 static absl::StatusOr<Screenshot> DecodePng(
220 const std::vector<uint8_t>& png_data);
221
228 static absl::StatusOr<std::vector<uint8_t>> EncodePng(
229 const Screenshot& screenshot);
230
237 static absl::StatusOr<Screenshot> LoadPng(const std::string& path);
238
246 static absl::Status SavePng(const Screenshot& screenshot,
247 const std::string& path);
248
249 // --- SSIM Calculation ---
250
258 static float CalculateSSIM(const Screenshot& a, const Screenshot& b);
259
268 static float CalculateRegionSSIM(const Screenshot& a, const Screenshot& b,
269 const ScreenRegion& region);
270
271 private:
273
274 // Core comparison implementation
276 const ScreenRegion& region);
277
278 // Pixel-exact comparison
280 const ScreenRegion& region);
281
282 // SSIM-based comparison
284 const ScreenRegion& region);
285
286 // Diff image generation
287 std::vector<uint8_t> GenerateRedHighlightDiff(const Screenshot& a,
288 const Screenshot& b,
289 const VisualDiffResult& result);
290 std::vector<uint8_t> GenerateHeatmapDiff(const Screenshot& a,
291 const Screenshot& b);
292 std::vector<uint8_t> GenerateSideBySideDiff(const Screenshot& a,
293 const Screenshot& b,
294 const VisualDiffResult& result);
295
296 // Region detection
297 std::vector<VisualDiffResult::DiffRegion> FindSignificantRegions(
298 const Screenshot& a, const Screenshot& b, int threshold);
299 void MergeNearbyRegions(std::vector<VisualDiffResult::DiffRegion>& regions);
300
301 // Helpers
302 bool ColorsMatch(const uint8_t* pixel_a, const uint8_t* pixel_b) const;
303 float PixelDifference(const uint8_t* pixel_a, const uint8_t* pixel_b) const;
304};
305
306} // namespace test
307} // namespace yaze
308
309#endif // YAZE_APP_TEST_VISUAL_DIFF_ENGINE_H_
High-level visual comparison engine for gRPC/MCP integration.
const VisualDiffConfig & GetConfig() const
bool ColorsMatch(const uint8_t *pixel_a, const uint8_t *pixel_b) const
static absl::StatusOr< Screenshot > DecodePng(const std::vector< uint8_t > &png_data)
Decode PNG data to Screenshot.
absl::StatusOr< VisualDiffResult > CompareWithReference(const std::vector< uint8_t > &png_data, const std::string &reference_path)
Compare PNG data against a reference file.
std::vector< uint8_t > GenerateRedHighlightDiff(const Screenshot &a, const Screenshot &b, const VisualDiffResult &result)
absl::StatusOr< VisualDiffResult > CompareRegion(const std::vector< uint8_t > &png_a, const std::vector< uint8_t > &png_b, const ScreenRegion &region)
Compare a specific region of two images.
void SetConfig(const VisualDiffConfig &config)
static float CalculateSSIM(const Screenshot &a, const Screenshot &b)
Calculate Structural Similarity Index.
VisualDiffResult ComparePixelExact(const Screenshot &a, const Screenshot &b, const ScreenRegion &region)
float PixelDifference(const uint8_t *pixel_a, const uint8_t *pixel_b) const
VisualDiffResult CompareSSIM(const Screenshot &a, const Screenshot &b, const ScreenRegion &region)
void MergeNearbyRegions(std::vector< VisualDiffResult::DiffRegion > &regions)
void SetTolerance(float tolerance)
std::vector< uint8_t > GenerateHeatmapDiff(const Screenshot &a, const Screenshot &b)
static absl::StatusOr< Screenshot > LoadPng(const std::string &path)
Load PNG from file.
absl::StatusOr< VisualDiffResult > ComparePngData(const std::vector< uint8_t > &png_a, const std::vector< uint8_t > &png_b)
Compare two PNG images from raw data.
static absl::Status SavePng(const Screenshot &screenshot, const std::string &path)
Save screenshot to PNG file.
absl::StatusOr< VisualDiffResult > ComparePngFiles(const std::string &path_a, const std::string &path_b)
Compare two PNG files.
VisualDiffResult CompareImpl(const Screenshot &a, const Screenshot &b, const ScreenRegion &region)
static absl::StatusOr< std::vector< uint8_t > > EncodePng(const Screenshot &screenshot)
Encode Screenshot to PNG.
VisualDiffResult CompareScreenshots(const Screenshot &a, const Screenshot &b)
Compare two Screenshot objects directly.
std::vector< uint8_t > GenerateSideBySideDiff(const Screenshot &a, const Screenshot &b, const VisualDiffResult &result)
absl::StatusOr< std::vector< uint8_t > > GenerateDiffPng(const Screenshot &a, const Screenshot &b)
Generate a diff image highlighting differences.
std::vector< VisualDiffResult::DiffRegion > FindSignificantRegions(const Screenshot &a, const Screenshot &b, int threshold)
static float CalculateRegionSSIM(const Screenshot &a, const Screenshot &b, const ScreenRegion &region)
Calculate SSIM for a specific region.
absl::Status SaveDiffImage(const VisualDiffResult &result, const std::string &output_path)
Save diff image to file.
Region of interest for screenshot comparison.
Screenshot data container.
Configuration for visual diff engine.
std::vector< ScreenRegion > ignore_regions
Result of visual comparison with diff image.
std::string ToJson() const
Serialize to JSON for MCP tool output.
std::vector< uint8_t > diff_image_png
std::string Format() const
Format result for human-readable output.
std::vector< DiffRegion > significant_regions