2 * kmscon - Bit-Blitting Bulk Text Renderer Backend
4 * Copyright (c) 2012 David Herrmann <dh.herrmann@googlemail.com>
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files
8 * (the "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * SECTION:text_bbulk.c
28 * @short_description: Bit-Blitting Bulk Text Renderer Backend
31 * Similar to the bblit renderer but assembles an array of blit-requests and
32 * pushes all of them at once to the video device.
41 #include "tsm_unicode.h"
44 #define LOG_SUBSYSTEM "text_bbulk"
47 struct uterm_video_blend_req *reqs;
50 #define FONT_WIDTH(txt) ((txt)->font->attr.width)
51 #define FONT_HEIGHT(txt) ((txt)->font->attr.height)
53 #define SCREEN_WIDTH(txt) uterm_screen_width((txt)->screen)
54 #define SCREEN_HEIGHT(txt) uterm_screen_height((txt)->screen)
56 static int bbulk_init(struct kmscon_text *txt)
60 bb = malloc(sizeof(*bb));
68 static void bbulk_destroy(struct kmscon_text *txt)
70 struct bbulk *bb = txt->data;
75 static int bbulk_set(struct kmscon_text *txt)
77 struct bbulk *bb = txt->data;
78 unsigned int sw, sh, i, j;
79 struct uterm_video_blend_req *req;
81 memset(bb, 0, sizeof(*bb));
83 sw = SCREEN_WIDTH(txt);
84 sh = SCREEN_HEIGHT(txt);
86 txt->cols = sw / FONT_WIDTH(txt);
87 txt->rows = sh / FONT_HEIGHT(txt);
89 bb->reqs = malloc(sizeof(*bb->reqs) * txt->cols * txt->rows);
92 memset(bb->reqs, 0, sizeof(*bb->reqs) * txt->cols * txt->rows);
94 for (i = 0; i < txt->rows; ++i) {
95 for (j = 0; j < txt->cols; ++j) {
96 req = &bb->reqs[i * txt->cols + j];
97 req->x = j * FONT_WIDTH(txt);
98 req->y = i * FONT_HEIGHT(txt);
105 static void bbulk_unset(struct kmscon_text *txt)
107 struct bbulk *bb = txt->data;
113 static int bbulk_draw(struct kmscon_text *txt, tsm_symbol_t ch,
114 unsigned int posx, unsigned int posy,
115 const struct kmscon_console_attr *attr)
117 struct bbulk *bb = txt->data;
118 const struct kmscon_glyph *glyph;
120 struct uterm_video_blend_req *req;
122 if (ch == 0 || ch == ' ') {
123 ret = kmscon_font_render_empty(txt->font, &glyph);
125 ret = kmscon_font_render(txt->font, ch, &glyph);
129 ret = kmscon_font_render_inval(txt->font, &glyph);
134 req = &bb->reqs[posy * txt->cols + posx];
135 req->buf = &glyph->buf;
155 static int bbulk_render(struct kmscon_text *txt)
157 struct bbulk *bb = txt->data;
159 return uterm_screen_blendv(txt->screen, bb->reqs,
160 txt->cols * txt->rows);
163 static const struct kmscon_text_ops kmscon_text_bbulk_ops = {
166 .destroy = bbulk_destroy,
168 .unset = bbulk_unset,
171 .render = bbulk_render,
175 int kmscon_text_bbulk_load(void)
179 ret = kmscon_text_register(&kmscon_text_bbulk_ops);
181 log_error("cannot register bbulk renderer");
188 void kmscon_text_bbulk_unload(void)
190 kmscon_text_unregister(kmscon_text_bbulk_ops.name);