Subversion Repositories HelenOS

Rev

Rev 4348 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2006 Josef Cejka
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup console
  30.  * @{
  31.  */
  32. /** @file
  33.  */
  34.  
  35. #include <screenbuffer.h>
  36. #include <io/style.h>
  37. #include <malloc.h>
  38. #include <unistd.h>
  39.  
  40. /** Store one character to screenbuffer.
  41.  *
  42.  * Its position is determined by scr->position_x
  43.  * and scr->position_y.
  44.  *
  45.  * @param scr Screenbuffer
  46.  * @param c   Stored character
  47.  *
  48.  */
  49. void screenbuffer_putchar(screenbuffer_t *scr, wchar_t ch)
  50. {
  51.     keyfield_t *field =
  52.         get_field_at(scr, scr->position_x, scr->position_y);
  53.    
  54.     field->character = ch;
  55.     field->attrs = scr->attrs;
  56. }
  57.  
  58. /** Initilize screenbuffer.
  59.  *
  60.  * Allocate space for screen content in accordance to given size.
  61.  *
  62.  * @param scr    Initialized screenbuffer
  63.  * @param size_x Width in characters
  64.  * @param size_y Height in characters
  65.  *
  66.  * @return Pointer to screenbuffer (same as scr parameter) or NULL
  67.  *
  68.  */
  69. screenbuffer_t *screenbuffer_init(screenbuffer_t *scr, size_t size_x, size_t size_y)
  70. {
  71.     scr->buffer = (keyfield_t *) malloc(sizeof(keyfield_t) * size_x * size_y);
  72.     if (!scr->buffer)
  73.         return NULL;
  74.    
  75.     scr->size_x = size_x;
  76.     scr->size_y = size_y;
  77.     scr->attrs.t = at_style;
  78.     scr->attrs.a.s.style = STYLE_NORMAL;
  79.     scr->is_cursor_visible = 1;
  80.    
  81.     screenbuffer_clear(scr);
  82.    
  83.     return scr;
  84. }
  85.  
  86. /** Clear screenbuffer.
  87.  *
  88.  * @param scr Screenbuffer
  89.  *
  90.  */
  91. void screenbuffer_clear(screenbuffer_t *scr)
  92. {
  93.     size_t i;
  94.    
  95.     for (i = 0; i < (scr->size_x * scr->size_y); i++) {
  96.         scr->buffer[i].character = ' ';
  97.         scr->buffer[i].attrs = scr->attrs;
  98.     }
  99.    
  100.     scr->top_line = 0;
  101.     scr->position_x = 0;
  102.     scr->position_y = 0;
  103. }
  104.  
  105. /** Clear one buffer line.
  106.  *
  107.  * @param scr
  108.  * @param line One buffer line (not a screen line!)
  109.  *
  110.  */
  111. void screenbuffer_clear_line(screenbuffer_t *scr, size_t line)
  112. {
  113.     size_t x;
  114.    
  115.     for (x = 0; x < scr->size_x; x++) {
  116.         scr->buffer[x + line * scr->size_x].character = ' ';
  117.         scr->buffer[x + line * scr->size_x].attrs = scr->attrs;
  118.     }
  119. }
  120.  
  121. /** Copy content buffer from screenbuffer to given memory.
  122.  *
  123.  * @param scr  Source screenbuffer
  124.  * @param dest Destination
  125.  *
  126.  */
  127. void screenbuffer_copy_buffer(screenbuffer_t *scr, keyfield_t *dest)
  128. {
  129.     size_t i;
  130.    
  131.     for (i = 0; i < (scr->size_x * scr->size_y); i++)
  132.         dest[i] = scr->buffer[i];
  133. }
  134.  
  135. /** Set new cursor position in screenbuffer.
  136.  *
  137.  * @param scr
  138.  * @param x
  139.  * @param y
  140.  *
  141.  */
  142. void screenbuffer_goto(screenbuffer_t *scr, size_t x, size_t y)
  143. {
  144.     scr->position_x = x % scr->size_x;
  145.     scr->position_y = y % scr->size_y;
  146. }
  147.  
  148. /** Set new style.
  149.  *
  150.  * @param scr
  151.  * @param fg_color
  152.  * @param bg_color
  153.  *
  154.  */
  155. void screenbuffer_set_style(screenbuffer_t *scr, uint8_t style)
  156. {
  157.     scr->attrs.t = at_style;
  158.     scr->attrs.a.s.style = style;
  159. }
  160.  
  161. /** Set new color.
  162.  *
  163.  * @param scr
  164.  * @param fg_color
  165.  * @param bg_color
  166.  *
  167.  */
  168. void screenbuffer_set_color(screenbuffer_t *scr, uint8_t fg_color, uint8_t bg_color, uint8_t flags)
  169. {
  170.     scr->attrs.t = at_idx;
  171.     scr->attrs.a.i.fg_color = fg_color;
  172.     scr->attrs.a.i.bg_color = bg_color;
  173.     scr->attrs.a.i.flags = flags;
  174. }
  175.  
  176. /** Set new RGB color.
  177.  *
  178.  * @param scr
  179.  * @param fg_color
  180.  * @param bg_color
  181.  *
  182.  */
  183. void screenbuffer_set_rgb_color(screenbuffer_t *scr, uint32_t fg_color, uint32_t bg_color)
  184. {
  185.     scr->attrs.t = at_rgb;
  186.     scr->attrs.a.r.fg_color = fg_color;
  187.     scr->attrs.a.r.bg_color = bg_color;
  188. }
  189.  
  190. /** @}
  191.  */
  192.