2 * Copyright (C) 2006 Josef Cejka
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
29 /** @addtogroup console
35 #include <screenbuffer.h>
39 /** Store one character to screenbuffer. Its position is determined by scr->position_x and scr->position_y.
40 * @param scr screenbuffer
41 * @param c stored character
43 void screenbuffer_putchar(screenbuffer_t
*scr
, char c
)
47 field
= get_field_at(scr
, scr
->position_x
, scr
->position_y
);
50 field
->style
= scr
->style
;
53 /** Initilize screenbuffer. Allocate space for screen content in accordance to given size.
54 * @param scr initialized screenbuffer
55 * @param size_x width in characters
56 * @param size_y height in characters
57 * @return pointer to screenbuffer (same as scr parameter) or NULL
59 screenbuffer_t
*screenbuffer_init(screenbuffer_t
*scr
, int size_x
, int size_y
)
61 if ((scr
->buffer
= (keyfield_t
*)malloc(sizeof(keyfield_t
) * size_x
* size_y
)) == NULL
) {
67 scr
->style
.fg_color
= DEFAULT_FOREGROUND
;
68 scr
->style
.bg_color
= DEFAULT_BACKGROUND
;
69 scr
->is_cursor_visible
= 1;
71 screenbuffer_clear(scr
);
76 /** Clear screenbuffer.
77 * @param scr screenbuffer
79 void screenbuffer_clear(screenbuffer_t
*scr
)
83 for (i
= 0; i
< (scr
->size_x
* scr
->size_y
); i
++) {
84 scr
->buffer
[i
].character
= ' ';
85 scr
->buffer
[i
].style
= scr
->style
;
93 /** Clear one buffer line.
95 * @param line One buffer line (not a screen line!)
97 void screenbuffer_clear_line(screenbuffer_t
*scr
, unsigned int line
)
101 for (i
= 0; i
< scr
->size_x
; i
++) {
102 scr
->buffer
[i
+ line
*scr
->size_x
].character
= ' ';
103 scr
->buffer
[i
+ line
*scr
->size_x
].style
= scr
->style
;
107 /** Copy content buffer from screenbuffer to given memory.
108 * @param scr source screenbuffer
109 * @param dest destination
111 void screenbuffer_copy_buffer(screenbuffer_t
*scr
, keyfield_t
*dest
)
115 for (i
= 0; i
< scr
->size_x
* scr
->size_y
; i
++) {
116 dest
[i
] = scr
->buffer
[i
];
120 /** Set new cursor position in screenbuffer.
125 void screenbuffer_goto(screenbuffer_t
*scr
, unsigned int x
, unsigned int y
)
127 scr
->position_x
= x
% scr
->size_x
;
128 scr
->position_y
= y
% scr
->size_y
;
136 void screenbuffer_set_style(screenbuffer_t
*scr
, unsigned int fg_color
, unsigned int bg_color
)
138 scr
->style
.fg_color
= fg_color
;
139 scr
->style
.bg_color
= bg_color
;