    // Copyright (C) 2008  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_DRAW_IMAGe_ABSTRACT
    #ifdef DLIB_DRAW_IMAGe_ABSTRACT

    #include "../matrix.h"
    #include "../image_processing/generic_image.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        template <
            typename image_type,
            typename pixel_type
            >
        void draw_line (
            image_type& img,
            const point& p1,
            const point& p2,
            const pixel_type& val
        );
        /*!
            requires
                - image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
            ensures
                - #img.nr() == img.nr() && #img.nc() == img.nc()
                  (i.e. the dimensions of the input image are not changed)
                - for all valid r and c that are on the line between point p1 and p2:
                    - performs assign_pixel(img[r][c], val)
                      (i.e. it draws the line from p1 to p2 onto the image)
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename image_type,
            typename pixel_type
            >
        void draw_line (
            long x1,
            long y1,
            long x2,
            long y2,
            image_type& img,
            const pixel_type& val
        );
        /*!
            requires
                - image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
            ensures
                - performs draw_line(img, point(x1,y1), point(x2,y2), val)
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename image_type,
            typename pixel_type
            >
        void draw_rectangle (
            image_type& img,
            const rectangle& rect,
            const pixel_type& val,
            unsigned int thickness = 1
        );
        /*!
            requires
                - image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - pixel_traits<pixel_type> is defined
            ensures
                - Draws the given rectangle onto the image img.  It does this by calling
                  draw_line() four times to draw the four sides of the rectangle.
                - The rectangle is drawn with the color given by val.
                - The drawn rectangle will have edges that are thickness pixels wide.
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename image_type,
            typename pixel_type
            >
        void draw_solid_circle (
            image_type& img,
            const dpoint& center_point,
            double radius,
            const pixel_type& pixel
        );
        /*!
            requires
                - image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - pixel_traits<pixel_type> is defined
            ensures
                - Draws a fully filled in circle onto image that is centered at center_point
                  and has the given radius.  The circle will be filled by assigning the given
                  pixel value to each element of the circle.
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename image_type,
            typename pixel_type
            >
        void fill_rect (
            image_type& img,
            const rectangle& rect,
            const pixel_type& pixel
        );
        /*!
            requires
                - image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - pixel_traits<pixel_type> is defined
            ensures
                - fills the area defined by rect in the given image with the given pixel value.
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename image_array_type
            >
        matrix<typename image_traits<typename image_array_type::value_type>::pixel_type> tile_images (
            const image_array_type& images
        );
        /*!
            requires
                - image_array_type is a dlib::array of image objects where each image object
                  implements the interface defined in dlib/image_processing/generic_image.h
            ensures
                - This function takes the given images and tiles them into a single large
                  square image and returns this new big tiled image.  Therefore, it is a useful
                  method to visualize many small images at once.
        !*/

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_DRAW_IMAGe_ABSTRACT