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.
43 #define LOG_SUBSYSTEM "text_bbulk"
46 struct uterm_video_blend_req *reqs;
49 #define FONT_WIDTH(txt) ((txt)->font->attr.width)
50 #define FONT_HEIGHT(txt) ((txt)->font->attr.height)
52 #define SCREEN_WIDTH(txt) uterm_screen_width((txt)->screen)
53 #define SCREEN_HEIGHT(txt) uterm_screen_height((txt)->screen)
55 static int bbulk_init(struct kmscon_text *txt)
59 bb = malloc(sizeof(*bb));
67 static void bbulk_destroy(struct kmscon_text *txt)
69 struct bbulk *bb = txt->data;
74 static int bbulk_set(struct kmscon_text *txt)
76 struct bbulk *bb = txt->data;
77 unsigned int sw, sh, i, j;
78 struct uterm_video_blend_req *req;
80 memset(bb, 0, sizeof(*bb));
82 sw = SCREEN_WIDTH(txt);
83 sh = SCREEN_HEIGHT(txt);
85 txt->cols = sw / FONT_WIDTH(txt);
86 txt->rows = sh / FONT_HEIGHT(txt);
88 bb->reqs = malloc(sizeof(*bb->reqs) * txt->cols * txt->rows);
91 memset(bb->reqs, 0, sizeof(*bb->reqs) * txt->cols * txt->rows);
93 for (i = 0; i < txt->rows; ++i) {
94 for (j = 0; j < txt->cols; ++j) {
95 req = &bb->reqs[i * txt->cols + j];
96 req->x = j * FONT_WIDTH(txt);
97 req->y = i * FONT_HEIGHT(txt);
104 static void bbulk_unset(struct kmscon_text *txt)
106 struct bbulk *bb = txt->data;
112 static int bbulk_draw(struct kmscon_text *txt,
113 uint32_t id, const uint32_t *ch, size_t len,
114 unsigned int posx, unsigned int posy,
115 const struct tsm_screen_attr *attr)
117 struct bbulk *bb = txt->data;
118 const struct kmscon_glyph *glyph;
120 struct uterm_video_blend_req *req;
121 struct kmscon_font *font;
124 font = txt->bold_font;
129 ret = kmscon_font_render_empty(font, &glyph);
131 ret = kmscon_font_render(font, id, ch, len, &glyph);
135 ret = kmscon_font_render_inval(font, &glyph);
140 req = &bb->reqs[posy * txt->cols + posx];
141 req->buf = &glyph->buf;
161 static int bbulk_render(struct kmscon_text *txt)
163 struct bbulk *bb = txt->data;
165 return uterm_screen_blendv(txt->screen, bb->reqs,
166 txt->cols * txt->rows);
169 static const struct kmscon_text_ops kmscon_text_bbulk_ops = {
172 .destroy = bbulk_destroy,
174 .unset = bbulk_unset,
177 .render = bbulk_render,
181 int kmscon_text_bbulk_load(void)
185 ret = kmscon_text_register(&kmscon_text_bbulk_ops);
187 log_error("cannot register bbulk renderer");
194 void kmscon_text_bbulk_unload(void)
196 kmscon_text_unregister(kmscon_text_bbulk_ops.name);