From a8f03cfb201046748a34b465a281d1aaf3ef56b6 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 24 Sep 2011 13:15:25 +0000 Subject: [PATCH] fix issue #435 : resizing not precise enough on small pictures/brushes. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1824 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/misc.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/misc.c b/src/misc.c index 5ace68d8..28a8ea0f 100644 --- a/src/misc.c +++ b/src/misc.c @@ -636,46 +636,47 @@ void Rescale(byte *src_buffer, short src_width, short src_height, byte *dst_buff int x_pos_in_brush; // Position courante dans l'ancienne brosse int y_pos_in_brush; - int delta_x_in_brush; // "Vecteur incrémental" du point précédent - int delta_y_in_brush; int initial_x_pos; // Position X de début de parcours de ligne + int initial_y_pos; // Position Y de début de parcours de ligne - // Calcul du "vecteur incrémental": - delta_x_in_brush=(src_width<<16) * (x_flipped?-1:1) / (dst_width); - delta_y_in_brush=(src_height<<16) * (y_flipped?-1:1) / (dst_height); + int delta_x, delta_y; offset=0; // Calcul de la valeur initiale de y_pos: - if (y_flipped) - y_pos_in_brush=(src_height<<16)-1; // Inversion en Y de la brosse - else - y_pos_in_brush=0; // Pas d'inversion en Y de la brosse + if (y_flipped) { + initial_y_pos=(src_height)-1; // Inversion en Y de la brosse + delta_y = -1 * src_height; + } else { + initial_y_pos=0; // Pas d'inversion en Y de la brosse + delta_y = src_height; + } // Calcul de la valeur initiale de x_pos pour chaque ligne: - if (x_flipped) - initial_x_pos = (src_width<<16)-1; // Inversion en X de la brosse - else + if (x_flipped) { + initial_x_pos = (src_width)-1; // Inversion en X de la brosse + delta_x = -1 * src_width; + } else { initial_x_pos = 0; // Pas d'inversion en X de la brosse + delta_x = src_width; + } // Pour chaque ligne for (line=0;line>16) + (y_pos_in_brush>>16)*src_width); // On passe à la colonne de brosse suivante: - x_pos_in_brush+=delta_x_in_brush; + x_pos_in_brush = initial_x_pos + column * delta_x / dst_width; + // On copie le pixel: + dst_buffer[offset]=*(src_buffer + x_pos_in_brush + y_pos_in_brush * src_width); // On passe au pixel suivant de la nouvelle brosse: offset++; } - // On passe à la ligne de brosse suivante: - y_pos_in_brush+=delta_y_in_brush; } }