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
This commit is contained in:
Adrien Destugues 2011-09-24 13:15:25 +00:00
parent 51c1a6de09
commit a8f03cfb20

View File

@ -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 x_pos_in_brush; // Position courante dans l'ancienne brosse
int y_pos_in_brush; 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_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": int delta_x, delta_y;
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);
offset=0; offset=0;
// Calcul de la valeur initiale de y_pos: // Calcul de la valeur initiale de y_pos:
if (y_flipped) if (y_flipped) {
y_pos_in_brush=(src_height<<16)-1; // Inversion en Y de la brosse initial_y_pos=(src_height)-1; // Inversion en Y de la brosse
else delta_y = -1 * src_height;
y_pos_in_brush=0; // Pas d'inversion en Y de la brosse } 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: // Calcul de la valeur initiale de x_pos pour chaque ligne:
if (x_flipped) if (x_flipped) {
initial_x_pos = (src_width<<16)-1; // Inversion en X de la brosse initial_x_pos = (src_width)-1; // Inversion en X de la brosse
else delta_x = -1 * src_width;
} else {
initial_x_pos = 0; // Pas d'inversion en X de la brosse initial_x_pos = 0; // Pas d'inversion en X de la brosse
delta_x = src_width;
}
// Pour chaque ligne // Pour chaque ligne
for (line=0;line<dst_height;line++) for (line=0;line<dst_height;line++)
{ {
// On repart du début de la ligne: // On passe à la ligne de brosse suivante:
x_pos_in_brush=initial_x_pos; y_pos_in_brush = initial_y_pos + line * delta_y / dst_height;
// Pour chaque colonne: // Pour chaque colonne:
for (column=0;column<dst_width;column++) for (column=0;column<dst_width;column++)
{ {
// On copie le pixel:
dst_buffer[offset]=*(src_buffer + (x_pos_in_brush>>16) + (y_pos_in_brush>>16)*src_width);
// On passe à la colonne de brosse suivante: // 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: // On passe au pixel suivant de la nouvelle brosse:
offset++; offset++;
} }
// On passe à la ligne de brosse suivante:
y_pos_in_brush+=delta_y_in_brush;
} }
} }