365 lines
13 KiB
C++
365 lines
13 KiB
C++
// Copyright (C) 2005 Davis E. King (davis@dlib.net), and Nils Labugt
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#undef DLIB_GUI_CANVAS_DRAWINg_ABSTRACT_
|
|
#ifdef DLIB_GUI_CANVAS_DRAWINg_ABSTRACT_
|
|
|
|
#include "../gui_core.h"
|
|
#include "../pixel.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_line (
|
|
const canvas& c,
|
|
const point& p1,
|
|
const point& p2,
|
|
const pixel_type& pixel = rgb_pixel(0,0,0),
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- draws the part of the line from p1 to p1 that overlaps with
|
|
the canvas and area onto the canvas.
|
|
- Uses the given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_rectangle (
|
|
const canvas& c,
|
|
rectangle rect,
|
|
const pixel_type& pixel = rgb_pixel(0,0,0),
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- Draws the part of the rectangle that overlaps with
|
|
the canvas and area onto the canvas.
|
|
- Uses the given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_circle (
|
|
const canvas& c,
|
|
const point& center_point,
|
|
double radius,
|
|
const pixel_type& pixel = rgb_pixel(0,0,0),
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- draws the part of the circle centered at center_point with the given radius
|
|
that overlaps with the canvas and area onto the canvas.
|
|
- Uses the given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_pixel (
|
|
const canvas& c,
|
|
const point& p,
|
|
const pixel_type& pixel
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- if (c.contains(p)) then
|
|
- sets the pixel in c that represents the point p to the
|
|
given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_solid_circle (
|
|
const canvas& c,
|
|
const point& center_point,
|
|
double radius,
|
|
const pixel_type& pixel = rgb_pixel(0,0,0),
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- draws the part of the solid circle centered at center_point with the given
|
|
radius that overlaps with the canvas and area onto the canvas.
|
|
("solid" means that the interior is also filled in with the given
|
|
pixel color)
|
|
- Uses the given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_solid_convex_polygon (
|
|
const canvas& c,
|
|
const std::vector<point>& polygon,
|
|
const pixel_type& pixel = rgb_pixel(0,0,0),
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- Interprets the given std::vector polygon object as defining a convex polygon
|
|
shape. In particular, the polygon is given by taking the points and drawing
|
|
lines between them. That is, imagine drawing a line connecting polygon[i]
|
|
and polygon[(i+1)%polygon.size()], for all valid i, and then filling in the
|
|
interior of the polygon. That is what this function does.
|
|
- When drawing the polygon, only the part of the polygon which overlaps both
|
|
the given canvas and area rectangle is drawn.
|
|
- Uses the given pixel color to draw the polygon.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
void draw_button_down (
|
|
const canvas& c,
|
|
const rectangle& btn,
|
|
unsigned char alpha = 255
|
|
);
|
|
/*!
|
|
requires
|
|
- 0 <= alpha <= 255
|
|
ensures
|
|
- draws the border of a button onto canvas c:
|
|
- the border will be that of a button that is depressed
|
|
- only the part of the border that overlaps with the canvas object
|
|
will be drawn.
|
|
- the border will be for the button whose area is defined by the
|
|
rectangle btn.
|
|
- performs alpha blending such that the button is drawn with full opacity
|
|
when alpha is 255 and fully transparent when alpha is 0.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
void draw_sunken_rectangle (
|
|
const canvas& c,
|
|
const rectangle& border,
|
|
unsigned char alpha = 255
|
|
);
|
|
/*!
|
|
requires
|
|
- 0 <= alpha <= 255
|
|
ensures
|
|
- draws a sunken rectangle around the given border.
|
|
(This is the type of border used for text_fields and
|
|
check_boxes and the like).
|
|
- performs alpha blending such that the rectangle is drawn with full opacity
|
|
when alpha is 255 and fully transparent when alpha is 0.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
void draw_button_up (
|
|
const canvas& c,
|
|
const rectangle& btn,
|
|
unsigned char alpha = 255
|
|
);
|
|
/*!
|
|
requires
|
|
- 0 <= alpha <= 255
|
|
ensures
|
|
- draws the border of a button onto canvas c:
|
|
- the border will be that of a button that is NOT depressed
|
|
- only the part of the border that overlaps with the canvas object
|
|
will be drawn.
|
|
- the border will be for the button whose area is defined by the
|
|
rectangle btn.
|
|
- performs alpha blending such that the button is drawn with full opacity
|
|
when alpha is 255 and fully transparent when alpha is 0.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_checkered (
|
|
const canvas& c,
|
|
const rectangle& area,
|
|
const pixel_type& pixel1,
|
|
const pixel_type& pixel2
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- fills the area on the given canvas defined by the rectangle area with a checkers
|
|
board pattern where every other pixel gets assigned either pixel1 or pixel2.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_type
|
|
>
|
|
void draw_image (
|
|
const canvas& c
|
|
const point& p,
|
|
const image_type& image,
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- image_type == an implementation of array2d/array2d_kernel_abstract.h
|
|
- pixel_traits<typename image_type::type> is defined
|
|
ensures
|
|
- draws the given image object onto the canvas such that the upper left corner of the
|
|
image will appear at the point p in the canvas's window. (note that the
|
|
upper left corner of the image is assumed to be the pixel image[0][0] and the
|
|
lower right corner of the image is assumed to be image[image.nr()-1][image.nc()-1])
|
|
- only draws the part of the image that overlaps with the area rectangle
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_type
|
|
>
|
|
void draw_image (
|
|
const canvas& c,
|
|
const rectangle& rect,
|
|
const image_type& img,
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- image_type == an implementation of array2d/array2d_kernel_abstract.h
|
|
- pixel_traits<typename image_type::type> is defined
|
|
ensures
|
|
- draws the given image object onto the canvas such that the upper left corner
|
|
of the image will appear at the point rect.tl_corner() in the canvas's window
|
|
and the lower right corner of the image will appear at rect.br_corner() in
|
|
the canvas's window. (note that the upper left corner of the image is
|
|
assumed to be the pixel image[0][0] and the lower right corner of the image
|
|
is assumed to be image[image.nr()-1][image.nc()-1])
|
|
- only draws the part of the image that overlaps with the area rectangle
|
|
- Uses nearest neighbor interpolation when the given rect isn't the same size
|
|
as the input image.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void fill_rect (
|
|
const canvas& c,
|
|
const rectangle& rect,
|
|
const pixel_type& pixel
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- fills the area defined by rect in the given canvas with the given pixel color.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void fill_rect_with_vertical_gradient (
|
|
const canvas& c,
|
|
const rectangle& rect,
|
|
const pixel_type& pixel_top,
|
|
const pixel_type& pixel_bottom,
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- fills the rectangle defined by rect in the given canvas with the given colors.
|
|
The top of the area will have the pixel_top color and will slowly fade
|
|
towards the pixel_bottom color towards the bottom of rect.
|
|
- only draws the part of the image that overlaps with the area rectangle
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void fill_gradient_rounded (
|
|
const canvas& c,
|
|
const rectangle& rect,
|
|
unsigned long radius,
|
|
const pixel_type& top_color,
|
|
const pixel_type& bottom_color,
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- Fills the region defined by rect in the given canvas with the given colors.
|
|
The top of the region will have the top_color color and will slowly fade
|
|
towards the bottom_color color towards the bottom of rect.
|
|
- The drawn rectangle will have rounded corners and with the amount of
|
|
- rounding given by the radius argument.
|
|
- only the part of this object that overlaps with area and the canvas
|
|
will be drawn on the canvas
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename pixel_type
|
|
>
|
|
void draw_rounded_rectangle (
|
|
const canvas& c,
|
|
const rectangle& rect,
|
|
unsigned radius,
|
|
const pixel_type& color,
|
|
const rectangle& area = rectangle(-infinity,-infinity,infinity,infinity)
|
|
);
|
|
/*!
|
|
requires
|
|
- pixel_traits<pixel_type> is defined
|
|
ensures
|
|
- Draws the part of the rectangle that overlaps with
|
|
the canvas onto the canvas.
|
|
- The drawn rectangle will have rounded corners and with the amount of
|
|
rounding given by the radius argument.
|
|
- Uses the given pixel color.
|
|
- only draws the part of the image that overlaps with the area rectangle
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_GUI_CANVAS_DRAWINg_ABSTRACT_
|
|
|