2 * kmscon - Bit-Blitting Bulk Text Renderer Backend
4 * Copyright (c) 2012-2013 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 "uterm_video.h"
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 static int bbulk_init(struct kmscon_text *txt)
56 bb = malloc(sizeof(*bb));
64 static void bbulk_destroy(struct kmscon_text *txt)
66 struct bbulk *bb = txt->data;
71 static int bbulk_set(struct kmscon_text *txt)
73 struct bbulk *bb = txt->data;
74 unsigned int sw, sh, i, j;
75 struct uterm_video_blend_req *req;
76 struct uterm_mode *mode;
78 memset(bb, 0, sizeof(*bb));
80 mode = uterm_display_get_current(txt->disp);
83 sw = uterm_mode_get_width(mode);
84 sh = uterm_mode_get_height(mode);
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,
114 uint32_t id, const uint32_t *ch, size_t len,
116 unsigned int posx, unsigned int posy,
117 const struct tsm_screen_attr *attr)
119 struct bbulk *bb = txt->data;
120 const struct kmscon_glyph *glyph;
122 struct uterm_video_blend_req *req;
123 struct kmscon_font *font;
126 bb->reqs[posy * txt->cols + posx].buf = NULL;
131 font = txt->bold_font;
136 ret = kmscon_font_render_empty(font, &glyph);
138 ret = kmscon_font_render(font, id, ch, len, &glyph);
142 ret = kmscon_font_render_inval(font, &glyph);
147 req = &bb->reqs[posy * txt->cols + posx];
148 req->buf = &glyph->buf;
168 static int bbulk_render(struct kmscon_text *txt)
170 struct bbulk *bb = txt->data;
172 return uterm_display_fake_blendv(txt->disp, bb->reqs,
173 txt->cols * txt->rows);
176 struct kmscon_text_ops kmscon_text_bbulk_ops = {
180 .destroy = bbulk_destroy,
182 .unset = bbulk_unset,
185 .render = bbulk_render,