From 70e2eac37f330b5ce184607ec8e27cf08b78817c Mon Sep 17 00:00:00 2001 From: b Date: Tue, 29 Nov 2022 15:26:18 +0100 Subject: [PATCH] Fixed the diff tool --- diff.c | 39 +++++++++++++++++++++++++++++++++++---- testimg/bsta-000000.png | Bin 0 -> 6540 bytes testimg/bsta-000012.png | Bin 0 -> 7563 bytes testimg/gradient_h.png | Bin 0 -> 1285 bytes testimg/gradient_v.png | Bin 0 -> 2524 bytes testimg/phys-0001.png | Bin 0 -> 9301 bytes testimg/phys-0002.png | Bin 0 -> 7101 bytes 7 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 testimg/bsta-000000.png create mode 100644 testimg/bsta-000012.png create mode 100644 testimg/gradient_h.png create mode 100644 testimg/gradient_v.png create mode 100644 testimg/phys-0001.png create mode 100644 testimg/phys-0002.png diff --git a/diff.c b/diff.c index b68fffc..23b7054 100644 --- a/diff.c +++ b/diff.c @@ -52,6 +52,7 @@ struct diff_data }; int difference (ILuint n, struct PixelInfo *p, void *data); +int palette_mix (ILuint n, struct PixelInfo *p, void *data); static inline ILuint diff_1ch (ILint64 x, ILint64 y, ILint64 A, ILint64 B, ILint64 F); char DIFF_MISSING_ARGS[] = "Missing parameters.\ndiff inPixA inPixB outPix [RA GA BA [RB GB BB]]\n"; @@ -103,7 +104,7 @@ int subtool_diff (int argc, char **argv, int argi, char **err) if ((info[0].image_height != info[1].image_height) || (info[0].image_width != info[1].image_width) || (info[0].num_images != info[1].num_images)) { *err = SIZE_MISMATCH; - return r; + return EINVAL; } if ((info[0].image_bpc != info[1].image_bpc) || (!(flags[0] & IS_OVER_8BIT)) || (!(flags[0] & IS_OVER_8BIT))) @@ -142,12 +143,14 @@ int subtool_diff (int argc, char **argv, int argi, char **err) } r = convert_picture(0, &(info[0]), &(flags[0])); + if (r!=0) { *err = CONVERT_FAILED; return EIO; } r = convert_picture(1, &(info[1]), &(flags[1])); + if (r!=0) { *err = CONVERT_FAILED; return EIO; @@ -183,6 +186,7 @@ int subtool_diff (int argc, char **argv, int argi, char **err) data.g_b = upscale_value(GB, info[0].image_bpc); data.b_b = upscale_value(BB, info[0].image_bpc); } + data.max = upscale_value(0xFF, info[0].image_bpc); r = build_picture_from_info(2, &(info[0]), &(info[2]), &(flags[2])); if (r!=0) @@ -215,6 +219,23 @@ int subtool_diff (int argc, char **argv, int argi, char **err) *err = CONVERT_FAILED; return r; } + flags[0] &= ~OK_PALETTE_ONLY; + flags[1] &= ~OK_PALETTE_ONLY; + flags[2] &= ~OK_PALETTE_ONLY; + r = perform_action( + 3, + id, + xyf0, xyf0, xyf0, + 0, 0, 0, + &palette_mix, + flags, + &data + ); + if (r) + { + *err = CONVERT_FAILED; + return r; + } } else { @@ -249,7 +270,7 @@ int difference (ILuint n, struct PixelInfo *p, void *data) struct diff_data *d; d = data; - if (n != 3) + if (n < 3) return EIO; p[2].red = diff_1ch(p[0].red, p[1].red, d->r_a, d->r_b, d->max); @@ -261,6 +282,16 @@ int difference (ILuint n, struct PixelInfo *p, void *data) return 0; } +int palette_mix (ILuint n, struct PixelInfo *p, void *data) +{ + if (n < 3) + return EIO; + + p[2].index = p[0].index * p[0].info.palette_num_cols + p[1].index; + + return 0; +} + static inline ILuint diff_1ch (ILint64 x, ILint64 y, ILint64 A, ILint64 B, ILint64 F) { ILint64 v; @@ -268,9 +299,9 @@ static inline ILuint diff_1ch (ILint64 x, ILint64 y, ILint64 A, ILint64 B, ILint if (x == y) return (ILuint) x; else if (x > y) - v = (A * (x - y)) / F; + v = y + ((A * (x - y)) / F); else - v = (B * (y - x)) / F; + v = x + ((B * (y - x)) / F); return (ILuint) v; } diff --git a/testimg/bsta-000000.png b/testimg/bsta-000000.png new file mode 100644 index 0000000000000000000000000000000000000000..20455e2970ae015d565f4cd13bc78fcef168c382 GIT binary patch literal 6540 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 V4Eqcp@$aijrlp|^mZ&{?^*_3@B;No4 literal 0 HcmV?d00001 diff --git a/testimg/gradient_h.png b/testimg/gradient_h.png new file mode 100644 index 0000000000000000000000000000000000000000..b65217ede7c8e55525a21b877743ad093941ef99 GIT binary patch literal 1285 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 QPe50+)b-R*DzD!CFD_trDgXcg literal 0 HcmV?d00001 diff --git a/testimg/phys-0002.png b/testimg/phys-0002.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd1b8a5b148e2e50c33462117868f96bb9be26d GIT binary patch literal 7101 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