diff --git a/builds/draw_bonus.o b/builds/draw_bonus.o index 69c22e3..96e4317 100644 Binary files a/builds/draw_bonus.o and b/builds/draw_bonus.o differ diff --git a/builds/fdf.o b/builds/fdf.o index 858b183..3806a75 100644 Binary files a/builds/fdf.o and b/builds/fdf.o differ diff --git a/builds/keypress_bonus.o b/builds/keypress_bonus.o index c48d85f..1204a13 100644 Binary files a/builds/keypress_bonus.o and b/builds/keypress_bonus.o differ diff --git a/builds/modifs.o b/builds/modifs.o index 534126f..15803a4 100644 Binary files a/builds/modifs.o and b/builds/modifs.o differ diff --git a/builds/parse.o b/builds/parse.o index 0f28926..6a97970 100644 Binary files a/builds/parse.o and b/builds/parse.o differ diff --git a/fdf b/fdf index e24d73d..bebbe74 100755 Binary files a/fdf and b/fdf differ diff --git a/includes/fdf.h b/includes/fdf.h index 3310eb7..b0219b0 100644 --- a/includes/fdf.h +++ b/includes/fdf.h @@ -54,6 +54,9 @@ void draw_grid(t_fdf *fdf, int i, int j); void draw_lines(t_fdf *fdf, int *start, int *end); void draw_color_pixel(t_fdf *fdf, int new_x, int new_y, int z); void draw_pixel(t_fdf *fdf, int x, int y, int color); +int is_outise_screen(t_fdf *fdf, int x, int y); +int get_primary_color(char primar, int percent); +int color_percent(t_fdf *fdf, int *p_start, int *p_end, int p_numerator, int p_denominator); // keypress.c void keypress_more(int keycode, t_fdf *fdf); diff --git a/srcs/draw_bonus.c b/srcs/draw_bonus.c index 58e3f82..1fecf27 100644 --- a/srcs/draw_bonus.c +++ b/srcs/draw_bonus.c @@ -32,16 +32,44 @@ void draw_grid(t_fdf *fdf, int i, int j) if (i + 1 < fdf->map_width) point_end = new_coordinates(fdf, i + 1, j); draw_lines(fdf, point_start, point_end); + free(point_end); + point_end = NULL; if (j + 1 < fdf->map_height) - { - free(point_end); point_end = new_coordinates(fdf, i, j + 1); - } draw_lines(fdf, point_start, point_end); free(point_start); free(point_end); } +void draw_lines(t_fdf *fdf, int *start, int *end) +{ + int dx; + int dy; + int i; + int j; + int percent; + + if (end) + { + dx = end[0] - start[0]; + dy = end[1] - start[1]; + i = 0; + j = 0; + while (ft_abs(i) <= ft_abs(dx) && ft_abs(j) <= ft_abs(dy)) + { + if (!is_outise_screen(fdf, start[0] + i, start[1] + j)) + { + percent = color_percent(fdf, start, end, ft_abs(i) + ft_abs(j), ft_abs(dx) + ft_abs(dy)); + draw_color_pixel(fdf, start[0] + i, start[1] + j, percent); + } + if (!ft_abs(dx) || ft_abs(j) < ft_abs(i * dy / dx)) + j += ft_sign(dy); + else + i += ft_sign(dx); + } + } +} + // return the position of the point p // in percentage of the total height of the map : // z_min---start---point---end----z_max @@ -59,7 +87,8 @@ void draw_grid(t_fdf *fdf, int i, int j) // - line : end - start // - p_numerator : px + py // - p_denominator : ex + ey -int color_percent(t_fdf *fdf, int *p_start, int *p_end, int p_numerator, int p_denominator) { +int color_percent(t_fdf *fdf, int *p_start, int *p_end, int p_numerator, int p_denominator) +{ int z_total; int start; int line; @@ -88,30 +117,18 @@ int color_percent(t_fdf *fdf, int *p_start, int *p_end, int p_numerator, int p_d return (percent); } -void draw_lines(t_fdf *fdf, int *start, int *end) +void draw_color_pixel(t_fdf *fdf, int new_x, int new_y, int percent) { - int dx; - int dy; - int i; - int j; - int percent; + int color_r; + int color_g; + int color_b; + int color; - if (end) - { - dx = end[0] - start[0]; - dy = end[1] - start[1]; - i = 0; - j = 0; - while (ft_abs(i) <= ft_abs(dx) && ft_abs(j) <= ft_abs(dy)) - { - percent = color_percent(fdf, start, end, ft_abs(i) + ft_abs(j), ft_abs(dx) + ft_abs(dy)); - draw_color_pixel(fdf, start[0] + i, start[1] + j, percent); - if (!ft_abs(dx) || ft_abs(j) < ft_abs(i * dy / dx)) - j += ft_sign(dy); - else - i += ft_sign(dx); - } - } + color_r = get_primary_color('r', percent); + color_g = get_primary_color('g', percent); + color_b = get_primary_color('b', percent); + color = (color_r << 16) + (color_g << 8) + color_b; + draw_pixel(fdf, new_x, new_y, color); } int get_primary_color(char primar, int percent) @@ -136,30 +153,24 @@ int get_primary_color(char primar, int percent) return (new_primary_color); } -void draw_color_pixel(t_fdf *fdf, int new_x, int new_y, int percent) -{ - int color_r; - int color_g; - int color_b; - int color; - - color_r = get_primary_color('r', percent); - color_g = get_primary_color('g', percent); - color_b = get_primary_color('b', percent); - color = (color_r << 16) + (color_g << 8) + color_b; - draw_pixel(fdf, new_x, new_y, color); -} - void draw_pixel(t_fdf *fdf, int x, int y, int color) { int position; + + if (is_outise_screen(fdf, x, y)) + return ; + position = y * fdf->img_sizel + x * fdf->img_bpp / 8; + *(unsigned int *)(fdf->img_addr + position) = color; +} + +int is_outise_screen(t_fdf *fdf, int x, int y) +{ int xmax; int ymax; xmax = fdf->img_sizel / (fdf->img_bpp / 8); ymax = fdf->img_size_y; if (x < 0 || y < 0 || x > xmax || y > ymax) - return ; - position = y * fdf->img_sizel + x * fdf->img_bpp / 8; - *(unsigned int *)(fdf->img_addr + position) = color; + return (1); + return (0); }