summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp_painter.c
diff options
context:
space:
mode:
Diffstat (limited to 'xrdp/xrdp_painter.c')
-rw-r--r--xrdp/xrdp_painter.c138
1 files changed, 128 insertions, 10 deletions
diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c
index b09df176..731a94c0 100644
--- a/xrdp/xrdp_painter.c
+++ b/xrdp/xrdp_painter.c
@@ -14,6 +14,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2004
painter, gc
@@ -31,6 +32,7 @@ struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wm)
self->wm = wm;
self->orders = wm->orders;
self->rop = 0xcc; /* copy */
+ self->font = xrdp_font_create(wm);
return self;
}
@@ -39,6 +41,7 @@ void xrdp_painter_delete(struct xrdp_painter* self)
{
if (self == 0)
return;
+ xrdp_font_delete(self->font);
g_free(self);
}
@@ -259,21 +262,21 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self,
b = b->parent;
}
palette_id = xrdp_cache_add_palette(self->wm->cache, self->wm->palette);
- i = 0;
- while (i < to_draw->width)
+ j = 0;
+ while (j < to_draw->height)
{
- j = 0;
- while (j < to_draw->height)
+ i = 0;
+ while (i < to_draw->width)
{
x1 = x + i;
y1 = y + j;
- MIN(w, SS, to_draw->width - i);
- MIN(h, SS, to_draw->height - j);
+ w = MIN(SS, to_draw->width - i);
+ h = MIN(SS, to_draw->height - j);
b = xrdp_bitmap_create(w, h, self->wm->screen->bpp, 0);
xrdp_bitmap_copy_box(to_draw, b, i, j, w, h);
bitmap_id = xrdp_cache_add_bitmap(self->wm->cache, b);
- HIWORD(cache_id, bitmap_id);
- LOWORD(cache_idx, bitmap_id);
+ cache_id = HIWORD(bitmap_id);
+ cache_idx = LOWORD(bitmap_id);
k = 0;
while (xrdp_region_get_rect(region, k, &rect) == 0)
{
@@ -324,10 +327,125 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self,
k++;
}
xrdp_bitmap_delete(b);
- j += SS;
+ i += SS;
}
- i += SS;
+ j += SS;
+ }
+ xrdp_region_delete(region);
+ return 0;
+}
+
+/*****************************************************************************/
+int xrdp_painter_text_width(struct xrdp_painter* self, char* text)
+{
+ int index;
+ int rv;
+ int len;
+ struct xrdp_font_item* font_item;
+
+ rv = 0;
+ len = g_strlen(text);
+ for (index = 0; index < len; index++)
+ {
+ font_item = self->font->font_items + text[index];
+ rv = rv + font_item->incby;
+ }
+ return rv;
+}
+
+/*****************************************************************************/
+int xrdp_painter_text_height(struct xrdp_painter* self, char* text)
+{
+ int index;
+ int rv;
+ int len;
+ struct xrdp_font_item* font_item;
+
+ rv = 0;
+ len = g_strlen(text);
+ for (index = 0; index < len; index++)
+ {
+ font_item = self->font->font_items + text[index];
+ rv = MAX(rv, font_item->height);
+ }
+ return rv;
+}
+
+/*****************************************************************************/
+int xrdp_painter_draw_text(struct xrdp_painter* self,
+ struct xrdp_bitmap* bitmap,
+ int x, int y, char* text)
+{
+ int i;
+ int f;
+ int c;
+ int k;
+ int x1;
+ int y1;
+ int flags;
+ int len;
+ int index;
+ int total_width;
+ int total_height;
+ char* data;
+ struct xrdp_region* region;
+ struct xrdp_rect rect;
+ struct xrdp_bitmap* b;
+ struct xrdp_font* font;
+ struct xrdp_font_item* font_item;
+
+ len = g_strlen(text);
+ if (len < 1)
+ return 0;
+
+ /* todo data */
+
+ if (bitmap->type == 0)
+ return 0;
+ font = self->font;
+ f = 0;
+ k = 0;
+ total_width = 0;
+ total_height = 0;
+ data = (char*)g_malloc(len * 4, 1);
+ for (index = 0; index < len; index++)
+ {
+ font_item = font->font_items + text[index];
+ i = xrdp_cache_add_char(self->wm->cache, font_item);
+ f = HIWORD(i);
+ c = LOWORD(i);
+ data[index * 2] = c;
+ data[index * 2 + 1] = k;
+ k = font_item->incby;
+ total_width += k;
+ total_height = MAX(total_height, font_item->height);
+ }
+ region = xrdp_region_create(self->wm);
+ xrdp_wm_get_vis_region(self->wm, bitmap, x, y, total_width, total_height,
+ region);
+ b = bitmap;
+ while (b != 0)
+ {
+ x = x + b->left;
+ y = y + b->top;
+ b = b->parent;
+ }
+ k = 0;
+ while (xrdp_region_get_rect(region, k, &rect) == 0)
+ {
+ x1 = x;
+ y1 = y;
+ rect.right--;
+ rect.bottom--;
+ flags = 0x03; /* 0x73; TEXT2_IMPLICIT_X and something else */
+ xrdp_orders_text(self->orders, f, flags, 0,
+ font->color, 0,
+ x1, y1, x1 + total_width, y1 + total_height,
+ 0, 0, 0, 0,
+ x1, y1 + total_height, data, len * 2, &rect);
+ k++;
}
xrdp_region_delete(region);
+ g_free(data);
return 0;
}