/*
* kmscon - Bit-Blitting Bulk Text Renderer Backend
*
- * Copyright (c) 2012 David Herrmann <dh.herrmann@googlemail.com>
+ * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@googlemail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
-#include "log.h"
-#include "static_misc.h"
+#include "shl_log.h"
#include "text.h"
-#include "unicode.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "text_bbulk"
#define FONT_WIDTH(txt) ((txt)->font->attr.width)
#define FONT_HEIGHT(txt) ((txt)->font->attr.height)
-#define SCREEN_WIDTH(txt) uterm_screen_width((txt)->screen)
-#define SCREEN_HEIGHT(txt) uterm_screen_height((txt)->screen)
-
static int bbulk_init(struct kmscon_text *txt)
{
struct bbulk *bb;
struct bbulk *bb = txt->data;
unsigned int sw, sh, i, j;
struct uterm_video_blend_req *req;
+ struct uterm_mode *mode;
memset(bb, 0, sizeof(*bb));
- sw = SCREEN_WIDTH(txt);
- sh = SCREEN_HEIGHT(txt);
+ mode = uterm_display_get_current(txt->disp);
+ if (!mode)
+ return -EINVAL;
+ sw = uterm_mode_get_width(mode);
+ sh = uterm_mode_get_height(mode);
txt->cols = sw / FONT_WIDTH(txt);
txt->rows = sh / FONT_HEIGHT(txt);
bb->reqs = NULL;
}
-static int bbulk_draw(struct kmscon_text *txt, kmscon_symbol_t ch,
+static int bbulk_draw(struct kmscon_text *txt,
+ uint32_t id, const uint32_t *ch, size_t len,
+ unsigned int width,
unsigned int posx, unsigned int posy,
- const struct kmscon_console_attr *attr)
+ const struct tsm_screen_attr *attr)
{
struct bbulk *bb = txt->data;
const struct kmscon_glyph *glyph;
int ret;
struct uterm_video_blend_req *req;
+ struct kmscon_font *font;
+
+ if (!width) {
+ bb->reqs[posy * txt->cols + posx].buf = NULL;
+ return 0;
+ }
+
+ if (attr->bold)
+ font = txt->bold_font;
+ else
+ font = txt->font;
- if (ch == 0 || ch == ' ') {
- ret = kmscon_font_render_empty(txt->font, &glyph);
+ if (!len) {
+ ret = kmscon_font_render_empty(font, &glyph);
} else {
- ret = kmscon_font_render(txt->font, ch, &glyph);
+ ret = kmscon_font_render(font, id, ch, len, &glyph);
}
if (ret) {
- ret = kmscon_font_render_inval(txt->font, &glyph);
+ ret = kmscon_font_render_inval(font, &glyph);
if (ret)
return ret;
}
{
struct bbulk *bb = txt->data;
- return uterm_screen_blendv(txt->screen, bb->reqs,
- txt->cols * txt->rows);
+ return uterm_display_fake_blendv(txt->disp, bb->reqs,
+ txt->cols * txt->rows);
}
-static const struct kmscon_text_ops kmscon_text_bbulk_ops = {
+struct kmscon_text_ops kmscon_text_bbulk_ops = {
.name = "bbulk",
+ .owner = NULL,
.init = bbulk_init,
.destroy = bbulk_destroy,
.set = bbulk_set,
.render = bbulk_render,
.abort = NULL,
};
-
-int kmscon_text_bbulk_load(void)
-{
- int ret;
-
- ret = kmscon_text_register(&kmscon_text_bbulk_ops);
- if (ret) {
- log_error("cannot register bbulk renderer");
- return ret;
- }
-
- return 0;
-}
-
-void kmscon_text_bbulk_unload(void)
-{
- kmscon_text_unregister(kmscon_text_bbulk_ops.name);
-}