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:
parent
51c1a6de09
commit
a8f03cfb20
39
src/misc.c
39
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 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user