"Fossies" - the Fresh Open Source Software Archive

Member "libcaca-0.99.beta20/caca/box.c" (22 May 2018, 5538 Bytes) of package /linux/privat/libcaca-0.99.beta20.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "box.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 0.99.beta19_vs_0.99.beta20.

    1 /*
    2  *  libcaca     Colour ASCII-Art library
    3  *  Copyright © 2002—2018 Sam Hocevar <sam@hocevar.net>
    4  *              All Rights Reserved
    5  *
    6  *  This library is free software. It comes without any warranty, to
    7  *  the extent permitted by applicable law. You can redistribute it
    8  *  and/or modify it under the terms of the Do What the Fuck You Want
    9  *  to Public License, Version 2, as published by Sam Hocevar. See
   10  *  http://www.wtfpl.net/ for more details.
   11  */
   12 
   13 /*
   14  *  This file contains box drawing functions, both filled and outline.
   15  */
   16 
   17 #include "config.h"
   18 
   19 #if !defined(__KERNEL__)
   20 #   include <stdlib.h>
   21 #endif
   22 
   23 #include "caca.h"
   24 #include "caca_internals.h"
   25 
   26 static int draw_box(caca_canvas_t *cv, int x, int y, int w, int h,
   27                     uint32_t const *chars);
   28 
   29 /** \brief Draw a box on the canvas using the given character.
   30  *
   31  *  This function never fails.
   32  *
   33  *  \param cv The handle to the libcaca canvas.
   34  *  \param x X coordinate of the upper-left corner of the box.
   35  *  \param y Y coordinate of the upper-left corner of the box.
   36  *  \param w Width of the box.
   37  *  \param h Height of the box.
   38  *  \param ch UTF-32 character to be used to draw the box.
   39  *  \return This function always returns 0.
   40  */
   41 int caca_draw_box(caca_canvas_t *cv, int x, int y, int w, int h, uint32_t ch)
   42 {
   43     int x2 = x + w - 1;
   44     int y2 = y + h - 1;
   45 
   46     caca_draw_line(cv,  x,  y,  x, y2, ch);
   47     caca_draw_line(cv,  x, y2, x2, y2, ch);
   48     caca_draw_line(cv, x2, y2, x2,  y, ch);
   49     caca_draw_line(cv, x2,  y,  x,  y, ch);
   50 
   51     return 0;
   52 }
   53 
   54 /** \brief Draw a thin box on the canvas.
   55  *
   56  *  This function never fails.
   57  *
   58  *  \param cv The handle to the libcaca canvas.
   59  *  \param x X coordinate of the upper-left corner of the box.
   60  *  \param y Y coordinate of the upper-left corner of the box.
   61  *  \param w Width of the box.
   62  *  \param h Height of the box.
   63  *  \return This function always returns 0.
   64  */
   65 int caca_draw_thin_box(caca_canvas_t *cv, int x, int y, int w, int h)
   66 {
   67     static uint32_t const ascii_chars[] =
   68     {
   69         '-', '|', ',', '`', '.', '\''
   70     };
   71 
   72     return draw_box(cv, x, y, w, h, ascii_chars);
   73 }
   74 
   75 /** \brief Draw a box on the canvas using CP437 characters.
   76  *
   77  *  This function never fails.
   78  *
   79  *  \param cv The handle to the libcaca canvas.
   80  *  \param x X coordinate of the upper-left corner of the box.
   81  *  \param y Y coordinate of the upper-left corner of the box.
   82  *  \param w Width of the box.
   83  *  \param h Height of the box.
   84  *  \return This function always returns 0.
   85  */
   86 int caca_draw_cp437_box(caca_canvas_t *cv, int x, int y, int w, int h)
   87 {
   88     static uint32_t const cp437_chars[] =
   89     {
   90         /* ─ │ ┌ └ ┐ ┘ */
   91         0x2500, 0x2502, 0x250c, 0x2514, 0x2510, 0x2518
   92     };
   93 
   94     return draw_box(cv, x, y, w, h, cp437_chars);
   95 }
   96 
   97 /** \brief Fill a box on the canvas using the given character.
   98  *
   99  *  This function never fails.
  100  *
  101  *  \param cv The handle to the libcaca canvas.
  102  *  \param x X coordinate of the upper-left corner of the box.
  103  *  \param y Y coordinate of the upper-left corner of the box.
  104  *  \param w Width of the box.
  105  *  \param h Height of the box.
  106  *  \param ch UTF-32 character to be used to draw the box.
  107  *  \return This function always returns 0.
  108  */
  109 int caca_fill_box(caca_canvas_t *cv, int x, int y, int w, int h,
  110                    uint32_t ch)
  111 {
  112     int i, j, xmax, ymax;
  113 
  114     int x2 = x + w - 1;
  115     int y2 = y + h - 1;
  116 
  117     if(x > x2)
  118     {
  119         int tmp = x;
  120         x = x2; x2 = tmp;
  121     }
  122 
  123     if(y > y2)
  124     {
  125         int tmp = y;
  126         y = y2; y2 = tmp;
  127     }
  128 
  129     xmax = cv->width - 1;
  130     ymax = cv->height - 1;
  131 
  132     if(x2 < 0 || y2 < 0 || x > xmax || y > ymax)
  133         return 0;
  134 
  135     if(x < 0) x = 0;
  136     if(y < 0) y = 0;
  137     if(x2 > xmax) x2 = xmax;
  138     if(y2 > ymax) y2 = ymax;
  139 
  140 #if 0
  141     /* FIXME: this fails with fullwidth character blits. Also, the dirty
  142      * rectangle handling may miss fullwidth cells. */
  143     /* Optimise dirty rectangle handling, part 1 */
  144     cv->dirty_disabled++;
  145 #endif
  146 
  147     for(j = y; j <= y2; j++)
  148         for(i = x; i <= x2; i++)
  149             caca_put_char(cv, i, j, ch);
  150 
  151 #if 0
  152     /* Optimise dirty rectangle handling, part 2 */
  153     cv->dirty_disabled--;
  154     if(!cv->dirty_disabled)
  155         caca_add_dirty_rect(cv, x, y, x2 - x + 1, y2 - y + 1);
  156 #endif
  157 
  158     return 0;
  159 }
  160 
  161 /*
  162  * XXX: The following functions are local.
  163  */
  164 
  165 static int draw_box(caca_canvas_t *cv, int x, int y, int w, int h,
  166                     uint32_t const *chars)
  167 {
  168     int i, j, xmax, ymax;
  169 
  170     int x2 = x + w - 1;
  171     int y2 = y + h - 1;
  172 
  173     if(x > x2)
  174     {
  175         int tmp = x;
  176         x = x2; x2 = tmp;
  177     }
  178 
  179     if(y > y2)
  180     {
  181         int tmp = y;
  182         y = y2; y2 = tmp;
  183     }
  184 
  185     xmax = cv->width - 1;
  186     ymax = cv->height - 1;
  187 
  188     if(x2 < 0 || y2 < 0 || x > xmax || y > ymax)
  189         return 0;
  190 
  191     /* Draw edges */
  192     if(y >= 0)
  193         for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++)
  194             caca_put_char(cv, i, y, chars[0]);
  195 
  196     if(y2 <= ymax)
  197         for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++)
  198             caca_put_char(cv, i, y2, chars[0]);
  199 
  200     if(x >= 0)
  201         for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++)
  202             caca_put_char(cv, x, j, chars[1]);
  203 
  204     if(x2 <= xmax)
  205         for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++)
  206             caca_put_char(cv, x2, j, chars[1]);
  207 
  208     /* Draw corners */
  209     caca_put_char(cv, x, y, chars[2]);
  210     caca_put_char(cv, x, y2, chars[3]);
  211     caca_put_char(cv, x2, y, chars[4]);
  212     caca_put_char(cv, x2, y2, chars[5]);
  213 
  214     return 0;
  215 }
  216