| 8 | using namespace OpenApoc; |
| 9 | |
| 10 | static bool testImage(const UString &imageName, const UString &referenceName) |
| 11 | { |
| 12 | auto img = fw().data->loadImage(imageName); |
| 13 | auto reference = fw().data->loadImage(referenceName); |
| 14 | if (!img) |
| 15 | { |
| 16 | LogWarning("Failed to load image"); |
| 17 | return false; |
| 18 | } |
| 19 | if (!reference) |
| 20 | { |
| 21 | LogWarning("Failed to load reference"); |
| 22 | return false; |
| 23 | } |
| 24 | |
| 25 | auto rgbImg = std::dynamic_pointer_cast<RGBImage>(img); |
| 26 | if (!rgbImg) |
| 27 | { |
| 28 | LogWarning("Image not RGBImage"); |
| 29 | return false; |
| 30 | } |
| 31 | |
| 32 | auto rgbReference = std::dynamic_pointer_cast<RGBImage>(reference); |
| 33 | if (!rgbReference) |
| 34 | { |
| 35 | LogWarning("Reference not RGB image"); |
| 36 | return false; |
| 37 | } |
| 38 | |
| 39 | if (img->size != reference->size) |
| 40 | { |
| 41 | LogWarning("Invalid size, %s doesn't match reference %s", img->size, reference->size); |
| 42 | return false; |
| 43 | } |
| 44 | |
| 45 | RGBImageLock imgLock(rgbImg, ImageLockUse::Read); |
| 46 | RGBImageLock refLock(rgbReference, ImageLockUse::Read); |
| 47 | |
| 48 | for (unsigned int y = 0; y < img->size.y; y++) |
| 49 | { |
| 50 | for (unsigned int x = 0; x < img->size.x; x++) |
| 51 | { |
| 52 | auto i = imgLock.get({x, y}); |
| 53 | auto r = refLock.get({x, y}); |
| 54 | if (i != r) |
| 55 | { |
| 56 | LogWarning( |
| 57 | "Image mismatch at {%d,%d} (RGBA img {%d,%d,%d,%d} != RGBA ref {%d,%d,%d,%d}", |
| 58 | x, y, (int)i.r, (int)i.g, (int)i.b, (int)i.a, (int)r.r, (int)r.g, (int)r.b, |
| 59 | (int)r.a); |
| 60 | |
| 61 | return false; |
| 62 | } |
| 63 | } |
| 64 | } |
| 65 | return true; |
| 66 | } |
| 67 | |