From 888c2a043444a5e0037823054049ca575b282818 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Tue, 31 May 2022 11:29:10 +0100 Subject: [PATCH 1/9] Font macro updates for adding font utilities --- common/defines.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/defines.h b/common/defines.h index ce680d91..1b5384cc 100644 --- a/common/defines.h +++ b/common/defines.h @@ -91,8 +91,10 @@ b = (c) & 0xff; \ } /* font macros */ -#define FONT_DATASIZE(f) \ - ((((f)->height * (((f)->width + 7) / 8)) + 3) & ~3); +#define FONT_DATASIZE_FROM_GEOMETRY(width,height) \ + ((((height) * (((width) + 7) / 8)) + 3) & ~3) +#define FONT_DATASIZE(f) FONT_DATASIZE_FROM_GEOMETRY((f->width), (f->height)) + /* use crc for bitmap cache lookups */ #define USE_CRC From 9875f0c0d8e2f5edcfaf1ab5e2cd0e08f49ce35b Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Fri, 17 Jun 2022 11:44:24 +0100 Subject: [PATCH 2/9] Add g_memmove() to os_calls --- common/os_calls.c | 7 +++++++ common/os_calls.h | 1 + 2 files changed, 8 insertions(+) diff --git a/common/os_calls.c b/common/os_calls.c index c8bade26..c29ac257 100644 --- a/common/os_calls.c +++ b/common/os_calls.c @@ -343,6 +343,13 @@ g_memcpy(void *d_ptr, const void *s_ptr, int size) memcpy(d_ptr, s_ptr, size); } +/*****************************************************************************/ +void +g_memmove(void *d_ptr, const void *s_ptr, int size) +{ + memmove(d_ptr, s_ptr, size); +} + /*****************************************************************************/ int g_getchar(void) diff --git a/common/os_calls.h b/common/os_calls.h index 9c8a200e..5719606e 100644 --- a/common/os_calls.h +++ b/common/os_calls.h @@ -62,6 +62,7 @@ void g_write(const char *format, ...) printflike(1, 2); void g_hexdump(const char *p, int len); void g_memset(void *ptr, int val, int size); void g_memcpy(void *d_ptr, const void *s_ptr, int size); +void g_memmove(void *d_ptr, const void *s_ptr, int size); int g_getchar(void); int g_tcp_set_no_delay(int sck); int g_tcp_set_keepalive(int sck); From 70622bf92b7f9c72b77b37552e593a492ae1125c Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Fri, 5 Aug 2022 17:26:31 +0100 Subject: [PATCH 3/9] Remove hard-coded values for font sizes. The font body height is now explicitly stored in the font structure. This is the definition that would be used for manual typesetting (i.e. the line spacing). This is used for calculating the heights of strings. The window title header has also been increased by 3 pixels from a hard-coded 18 to (font_height + 5), which now equates to 21 pixels with the sans-10.fv1 font. --- xrdp/xrdp.h | 4 +-- xrdp/xrdp_bitmap.c | 24 ++++++++++++------ xrdp/xrdp_font.c | 8 ++++++ xrdp/xrdp_login_wnd.c | 28 +++++++++++++++------ xrdp/xrdp_painter.c | 57 ++++++++++++------------------------------- xrdp/xrdp_types.h | 2 ++ 6 files changed, 64 insertions(+), 59 deletions(-) diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index d1ae20fb..d6d66b78 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -301,8 +301,8 @@ xrdp_painter_draw_bitmap(struct xrdp_painter *self, int x, int y, int cx, int cy); int xrdp_painter_text_width(struct xrdp_painter *self, const char *text); -int -xrdp_painter_text_height(struct xrdp_painter *self, const char *text); +unsigned int +xrdp_painter_font_body_height(const struct xrdp_painter *self); int xrdp_painter_draw_text(struct xrdp_painter *self, struct xrdp_bitmap *bitmap, diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 72aafff2..39affa8f 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -111,6 +111,7 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap *self, int focused) { struct xrdp_painter *painter = (struct xrdp_painter *)NULL; + unsigned int font_height; if (self == 0) { @@ -125,19 +126,22 @@ xrdp_bitmap_set_focus(struct xrdp_bitmap *self, int focused) painter = xrdp_painter_create(self->wm, self->wm->session); xrdp_painter_font_needed(painter); xrdp_painter_begin_update(painter); + font_height = xrdp_painter_font_body_height(painter); if (focused) { /* active title bar */ painter->fg_color = self->wm->blue; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + xrdp_painter_fill_rect(painter, self, 3, 3, + self->width - 5, font_height + 5); painter->fg_color = self->wm->white; } else { /* inactive title bar */ painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + xrdp_painter_fill_rect(painter, self, 3, 3, + self->width - 5, font_height + 5); painter->fg_color = self->wm->black; } @@ -616,6 +620,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) struct xrdp_rect r1; struct xrdp_rect r2; struct xrdp_painter *painter; + unsigned int font_height; twchar wtext[256]; char text[256]; char *p; @@ -632,6 +637,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) painter = xrdp_painter_create(self->wm, self->wm->session); xrdp_painter_font_needed(painter); + font_height = xrdp_painter_font_body_height(painter); painter->rop = 0xcc; /* copy */ if (rect == 0) @@ -684,14 +690,16 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) { /* active title bar */ painter->fg_color = self->wm->blue; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + xrdp_painter_fill_rect(painter, self, 3, 3, + self->width - 5, font_height + 5); painter->fg_color = self->wm->white; } else { /* inactive title bar */ painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + xrdp_painter_fill_rect(painter, self, 3, 3, + self->width - 5, font_height + 5); painter->fg_color = self->wm->black; } @@ -742,7 +750,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) xrdp_bitmap_draw_button(self, painter, 0, 0, self->width, self->height, 0); w = xrdp_painter_text_width(painter, self->caption1); - h = xrdp_painter_text_height(painter, self->caption1); + h = xrdp_painter_font_body_height(painter); painter->fg_color = self->wm->black; xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2, self->height / 2 - h / 2, self->caption1); @@ -764,7 +772,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) xrdp_bitmap_draw_button(self, painter, 0, 0, self->width, self->height, 1); w = xrdp_painter_text_width(painter, self->caption1); - h = xrdp_painter_text_height(painter, self->caption1); + h = xrdp_painter_font_body_height(painter); painter->fg_color = self->wm->black; xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1, (self->height / 2 - h / 2) + 1, self->caption1); @@ -941,7 +949,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) if (self->popped_from != 0) { /* change height if there are too many items in the list */ - i = xrdp_painter_text_height(painter, "W"); + i = xrdp_painter_font_body_height(painter); i = self->popped_from->string_list->count * i; if (i > self->height) @@ -961,7 +969,7 @@ xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) for (i = 0; i < self->popped_from->string_list->count; i++) { p = (char *)list_get_item(self->popped_from->string_list, i); - h = xrdp_painter_text_height(painter, p); + h = xrdp_painter_font_body_height(painter); self->item_height = h; if (i == self->item_index) diff --git a/xrdp/xrdp_font.c b/xrdp/xrdp_font.c index c089db00..cc6670d0 100644 --- a/xrdp/xrdp_font.c +++ b/xrdp/xrdp_font.c @@ -157,7 +157,15 @@ xrdp_font_create(struct xrdp_wm *wm) index++; } + + if (self->body_height == 0 && index > 32) + { + /* Older font made for xrdp v0.9.x. Synthesise this + * value from the first glyph */ + self->body_height = -self->font_items[32].baseline + 1; + } } + } free_stream(s); diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 3cd7d078..8bc04d15 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -72,20 +72,32 @@ xrdp_wm_login_help_notify(struct xrdp_bitmap *wnd, if (p != 0) { + const int x = 10; + int y = xrdp_painter_font_body_height(p) * 2; + const int row_height = xrdp_painter_font_body_height(p); + const int end_para_height = row_height * 3 / 2; + p->fg_color = wnd->wm->black; - xrdp_painter_draw_text(p, wnd, 10, 30, "You must be authenticated \ + xrdp_painter_draw_text(p, wnd, x, y, "You must be authenticated \ before using this"); - xrdp_painter_draw_text(p, wnd, 10, 46, "session."); - xrdp_painter_draw_text(p, wnd, 10, 78, "Enter a valid username in \ + y += row_height; + xrdp_painter_draw_text(p, wnd, x, y, "session."); + y += end_para_height; + xrdp_painter_draw_text(p, wnd, x, y, "Enter a valid username in \ the username edit box."); - xrdp_painter_draw_text(p, wnd, 10, 94, "Enter the password in \ + y += end_para_height; + xrdp_painter_draw_text(p, wnd, x, y, "Enter the password in \ the password edit box."); - xrdp_painter_draw_text(p, wnd, 10, 110, "Both the username and \ + y += end_para_height; + xrdp_painter_draw_text(p, wnd, x, y, "Both the username and \ password are case"); - xrdp_painter_draw_text(p, wnd, 10, 126, "sensitive."); - xrdp_painter_draw_text(p, wnd, 10, 158, "Contact your system \ + y += row_height; + xrdp_painter_draw_text(p, wnd, x, y, "sensitive."); + y += end_para_height; + xrdp_painter_draw_text(p, wnd, x, y, "Contact your system \ administrator if you are"); - xrdp_painter_draw_text(p, wnd, 10, 174, "having problems \ + y += row_height; + xrdp_painter_draw_text(p, wnd, x, y, "having problems \ logging on."); } } diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c index b02c9072..995f51f0 100644 --- a/xrdp/xrdp_painter.c +++ b/xrdp/xrdp_painter.c @@ -30,7 +30,6 @@ #endif - #if defined(XRDP_PAINTER) /*****************************************************************************/ @@ -464,41 +463,10 @@ xrdp_painter_text_width(struct xrdp_painter *self, const char *text) } /*****************************************************************************/ -int -xrdp_painter_text_height(struct xrdp_painter *self, const char *text) +unsigned int +xrdp_painter_font_body_height(const struct xrdp_painter *self) { - int index; - int rv; - int len; - struct xrdp_font_char *font_item; - twchar *wstr; - - LOG_DEVEL(LOG_LEVEL_DEBUG, "xrdp_painter_text_height:"); - xrdp_painter_font_needed(self); - - if (self->font == 0) - { - return 0; - } - - if (text == 0) - { - return 0; - } - - rv = 0; - len = g_mbstowcs(0, text, 0); - wstr = (twchar *)g_malloc((len + 2) * sizeof(twchar), 0); - g_mbstowcs(wstr, text, len + 1); - - for (index = 0; index < len; index++) - { - font_item = self->font->font_items + wstr[index]; - rv = MAX(rv, font_item->height); - } - - g_free(wstr); - return rv; + return (self->font == NULL) ? 0 : self->font->body_height; } /*****************************************************************************/ @@ -830,7 +798,6 @@ xrdp_painter_draw_text(struct xrdp_painter *self, return 0; } - len = g_mbstowcs(0, text, 0); if (len < 1) @@ -873,7 +840,11 @@ xrdp_painter_draw_text(struct xrdp_painter *self, font_item = font->font_items + wstr[index]; k = font_item->incby; total_width += k; - total_height = MAX(total_height, font_item->height); + /* Use the nominal height of the font to work out the + * actual height of this glyph */ + int glyph_height = + font->body_height + font_item->baseline + font_item->height; + total_height = MAX(total_height, glyph_height); } xrdp_bitmap_get_screen_clip(dst, self, &clip_rect, &dx, &dy); region = xrdp_region_create(self->wm); @@ -912,12 +883,12 @@ xrdp_painter_draw_text(struct xrdp_painter *self, pat.height = font_item->height; pat.data = font_item->data; x1 = x + font_item->offset; - y1 = y + (font_item->height + font_item->baseline); + y1 = y + (font->body_height + font_item->baseline); painter_fill_pattern(self->painter, &dst_pb, &pat, 0, 0, x1, y1, font_item->width, font_item->height); - xrdp_painter_add_dirty_rect(self, x, y, + xrdp_painter_add_dirty_rect(self, x1, y1, font_item->width, font_item->height, &draw_rect); @@ -954,7 +925,11 @@ xrdp_painter_draw_text(struct xrdp_painter *self, data[index * 2 + 1] = k; k = font_item->incby; total_width += k; - total_height = MAX(total_height, font_item->height); + /* Use the nominal height of the font to work out the + * actual height of this glyph */ + int glyph_height = + font->body_height + font_item->baseline + font_item->height; + total_height = MAX(total_height, glyph_height); } xrdp_bitmap_get_screen_clip(dst, self, &clip_rect, &dx, &dy); @@ -979,7 +954,7 @@ xrdp_painter_draw_text(struct xrdp_painter *self, if (rect_intersect(&rect, &clip_rect, &draw_rect)) { x1 = x; - y1 = y + total_height; + y1 = y + font->body_height; flags = 0x03; /* 0x03 0x73; TEXT2_IMPLICIT_X and something else */ libxrdp_orders_text(self->session, f, flags, 0, self->fg_color, 0, diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 24c6cf25..2f907f03 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -626,6 +626,8 @@ struct xrdp_font struct xrdp_font_char font_items[NUM_FONTS]; char name[32]; int size; + /** Body height in pixels */ + int body_height; int style; }; From ae6a55dbacc46d2dd026ded80245408ec8da9165 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:54:51 +0100 Subject: [PATCH 4/9] Replace Windows font utility with native utilities To generate new fonts, the freetype2 library is required. This can now be specified by configure in the usual way. If it's missing, new fonts cannot be generated. --- Makefile.am | 2 +- README.md | 2 +- configure.ac | 46 +- docs/man/Makefile.am | 11 +- docs/man/xrdp-dumpfv1.8.in | 58 ++ docs/man/xrdp-mkfv1.8.in | 81 +++ fontutils/Makefile.am | 34 ++ fontutils/dumpfv1.c | 413 +++++++++++++++ fontutils/fv1.c | 352 ++++++++++++ fontutils/fv1.h | 100 ++++ fontutils/mkfv1.c | 587 +++++++++++++++++++++ {fontdump => fontutils/windows}/.gitignore | 0 {fontdump => fontutils/windows}/Makefile | 0 {fontdump => fontutils/windows}/fontdump.c | 0 14 files changed, 1678 insertions(+), 8 deletions(-) create mode 100644 docs/man/xrdp-dumpfv1.8.in create mode 100644 docs/man/xrdp-mkfv1.8.in create mode 100644 fontutils/Makefile.am create mode 100644 fontutils/dumpfv1.c create mode 100644 fontutils/fv1.c create mode 100644 fontutils/fv1.h create mode 100644 fontutils/mkfv1.c rename {fontdump => fontutils/windows}/.gitignore (100%) rename {fontdump => fontutils/windows}/Makefile (100%) rename {fontdump => fontutils/windows}/fontdump.c (100%) diff --git a/Makefile.am b/Makefile.am index 7e724f34..d7a5d846 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,6 @@ EXTRA_DIST = \ astyle_config.as \ bootstrap \ coding_style.md \ - fontdump \ m4 \ vrplayer @@ -57,6 +56,7 @@ SUBDIRS = \ $(RFXCODECDIR) \ sesman \ xrdp \ + fontutils \ keygen \ docs \ instfiles \ diff --git a/README.md b/README.md index e2d05699..2617c44f 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ pulseaudio modules. The build instructions can be found at wiki. xrdp ├── common ······ common code ├── docs ········ documentation -├── fontdump ···· font dump for Windows +├── fontutils ··· font handling utilities ├── genkeymap ··· keymap generator ├── instfiles ··· installable data file ├── keygen ······ xrdp RSA key pair generator diff --git a/configure.ac b/configure.ac index 895319b9..3759cd6b 100644 --- a/configure.ac +++ b/configure.ac @@ -190,6 +190,8 @@ AM_CONDITIONAL(XRDP_RDPSNDAUDIN, [test x$enable_rdpsndaudin = xyes]) AC_ARG_WITH(imlib2, AC_HELP_STRING([--with-imlib2=ARG], [imlib2 library to use for non-BMP backgrounds (ARG=yes/no/)]),,) +AC_ARG_WITH(freetype2, AC_HELP_STRING([--with-freetype2=ARG], [freetype2 library to use for rendering fonts (ARG=yes/no/)]),,) + # Obsolete options AC_ARG_ENABLE(xrdpdebug, AS_HELP_STRING([--enable-xrdpdebug], [This option is no longer supported - use --enable-devel-all])) @@ -278,6 +280,41 @@ if test x$use_imlib2 = xyes; then AC_DEFINE([USE_IMLIB2],1, [Compile with imlib2 support]) fi +# Find freetype2 +case "$with_freetype2" in + '' | no) AC_MSG_NOTICE([freetype2 will not be supported]) + use_freetype2=no + ;; + yes) + PKG_CHECK_MODULES([FREETYPE2], [freetype2 >= 2.8], + [use_freetype2=yes], + [AC_MSG_ERROR([please install libfreetype6-dev or freetype-devel])]) + ;; + /*) AC_MSG_CHECKING([for freetype2 in $with_freetype2]) + if test -d $with_freetype2/lib; then + FREETYPE2_LIBS="-L$with_freetype2/lib -llibfreetype" + elif test -d $with_freetype2/lib64; then + FREETYPE2_LIBS="-L$with_freetype2/lib64 -llibfreetype" + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Can't find libfreetype in $with_freetype2]) + fi + + if test -f $with_freetype2/include/freetype2/ft2build.h; then + FREETYPE2_CFLAGS="-I $with_freetype2/include/freetype2" + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Can't find $with_freetype2/include/freetype2/ft2build.h]) + fi + AC_MSG_RESULT([yes]) + AC_SUBST([FREETYPE2_LIBS]) + AC_SUBST([FREETYPE2_CFLAGS]) + use_freetype2=yes + ;; + *) AC_MSG_ERROR([--with-freetype2 needs yes/no or absolute path]) +esac +AM_CONDITIONAL([USE_FREETYPE2], [test "x$use_freetype2" = xyes]) + # Check only one auth mechanism is specified, and give it a name auth_cnt=0 auth_mech="Builtin" @@ -494,6 +531,7 @@ AC_CONFIG_FILES([ common/Makefile docs/Makefile docs/man/Makefile + fontutils/Makefile genkeymap/Makefile instfiles/default/Makefile instfiles/init.d/Makefile @@ -551,11 +589,9 @@ echo " vsock $enable_vsock" echo " auth mechanism $auth_mech" echo " rdpsndaudin $enable_rdpsndaudin" echo -if test x$use_imlib2 = xyes; then - echo " with imlib2 yes" -else - echo " with imlib2 no" -fi +echo " with imlib2 $use_imlib2" +echo " with freetype2 $use_freetype2" + echo echo " development logging $devel_logging" echo " development streamcheck $devel_streamcheck" diff --git a/docs/man/Makefile.am b/docs/man/Makefile.am index b55919fe..8da6cd96 100644 --- a/docs/man/Makefile.am +++ b/docs/man/Makefile.am @@ -1,3 +1,9 @@ +if USE_FREETYPE2 + MKFV1_MAN = xrdp-mkfv1.8 +else + MKFV1_MAN = +endif + man_MANS = \ xrdp-dis.1 \ sesman.ini.5 \ @@ -8,7 +14,9 @@ man_MANS = \ xrdp-keygen.8 \ xrdp-sesadmin.8 \ xrdp-sesman.8 \ - xrdp-sesrun.8 + xrdp-sesrun.8 \ + xrdp-dumpfv1.8 \ + $(MKFV1_MAN) EXTRA_DIST = $(man_MANS:=.in) @@ -21,6 +29,7 @@ SUBST_VARS = sed \ -e 's|@socketdir[@]|$(socketdir)|g' \ -e 's|@sesmanruntimedir[@]|$(sesmanruntimedir)|g' \ -e 's|@xrdpconfdir[@]|$(sysconfdir)/xrdp|g' \ + -e 's|@xrdpdatadir[@]|$(datadir)/xrdp|g' \ -e 's|@xrdphomeurl[@]|http://www.xrdp.org/|g' subst_verbose = $(subst_verbose_@AM_V@) diff --git a/docs/man/xrdp-dumpfv1.8.in b/docs/man/xrdp-dumpfv1.8.in new file mode 100644 index 00000000..a175e22a --- /dev/null +++ b/docs/man/xrdp-dumpfv1.8.in @@ -0,0 +1,58 @@ +.TH "xrdp-dumpfv1" "8" "@PACKAGE_VERSION@" "xrdp team" +.SH NAME +xrdp\-dumpfv1 \- Display content of .fv1 font files + +.SH SYNOPSIS +\fBxrdp-dumpfv1\fR [ options ] fv1_file + +.SH DESCRIPTION +\fBxrdp\-dumpfv1\fP can be used to display the contents of an fv1 file. + +.SH OPTIONS +A summary of options is included below. + +One of \fB\-i\fR, \fB\-t\fR, or \fB\-c\fR must be specified. +.TP +\fB\-i\fR +Displays general information about the fv1 file. + +.TP +\fB\-t\fR +Displays a CSV table of all the glyphs in the font. This table can be +imported into a spreadsheet program for further manipulation. + +.TP +\fB\-c\fR +Displays detailed information about a particular glyph in the font, +including a representation of the bitmap for the glyph. + +Specify the character using one of the following strings: + +\fBU+\fR - Unicode character, e.g. \fBU+25\fR for a percentage symbol (%). + +\fB@\fR - Unicode character, e.g. \fB@%\fR for a percentage symbol. + +\fBnumber\fR - Unicode value as an integer, e.g. \fB37\fR for a +percentage symbol + +Note that the row numbers shown in the font data are relative to the +natural font baseline. If comparing two fonts, be aware that when the +glyph is drawn, the row number may be affected by the global descender +value for the font (displayed with \fB\-i\fR). + +.SH "EXAMPLES" +.TP +\fBxrdp\-dumpfv1 -i @xrdpdatadir@/sans-10.fv1\fR +Displays global information about the sans 10 font file distributed with xrdp. + +.TP +\fBxrdp\-dumpfv1 -c @'*' @xrdpdatadir@/sans-10.fv1\fR +Displays information about the asterisk symbol in the sans 10 font file distributed with xrdp. + +.SH SEE ALSO +.BR xrdp\-mkfv1(8). + +More info on \fBxrdp\fR can be found on the +.UR @xrdphomeurl@ +xrdp homepage +.UE diff --git a/docs/man/xrdp-mkfv1.8.in b/docs/man/xrdp-mkfv1.8.in new file mode 100644 index 00000000..10023e53 --- /dev/null +++ b/docs/man/xrdp-mkfv1.8.in @@ -0,0 +1,81 @@ +.TH "xrdp-mkfv1" "8" "@PACKAGE_VERSION@" "xrdp team" +.SH NAME +xrdp\-mkfv1 \- Create .fv1 font files from other font files + +.SH SYNOPSIS +\fBxrdp-mkfv1\fR [ options ] font_file fv1_file + +.SH DESCRIPTION +\fBxrdp\-mkfv1\fP can be used to convert a font file such as a TrueType +font to a fv1 file. + +.SH OPTIONS +A summary of options is included below. + +.TP +\fB\-n\fR +Give the font a name, which is stored in the font header. + +The default is to use the font family name from the source font. + +.TP +\fB\-p\fR +Set the point size of the font. A fixed DPI value of 96 is used for +converting this value into a pixel size. + +The default value for this option is '10'. + +.TP +\fB\-m\fR +Set the limit on the glyphs stored in the font file. The argument is the last +glyph stored in the font file. + +Specify the glyph using one of the following strings: + +\fBU+\fR - Unicode character, e.g. \fBU+25\fR for a percentage symbol (%). + +\fB@\fR - Unicode character, e.g. \fB@%\fR for a percentage symbol. + +\fBnumber\fR - Unicode value as an integer, e.g. \fB37\fR for a +percentage symbol + +The default value for this option is 'U+4DFF'. + +.TP +\fB\-C\fR +When used with the "DejaVu Sans" font at a point-size of 10, a small +number of glyphs are assigned a different x-offset than they have +when the original Windows font generation program is used. + +This switch can be used to preserve the original x-offsets for glyphs in +the range U+0020 - U+00FF when a 10 point DajaVu Sans font is generated. + +Use one of the following arguments to this option:- + +\fBauto\fR - Automatic mode. Offsets are preserved if a "DajaVu Sans" 10-point font is converted. + +\fBon / true / yes\fR - Preserve offsets if automatic font detection does not work. + +\fBoff / false / no\fR - Do not tamper with the offsets generated by the program. + +The default value of this switch is \fRauto\fR. + +To see the effects of this switch, set the \fBMKFV1_LOG_LEVEL\fR environment +variable to \fBinfo\fR before running the program. + +.SH "EXAMPLES" +.TP +\fBxrdp-mkfv1 -p18 /path/to/DejaVuSans.ttf ./sans-18.fv1\fR +Generate an 18-point Deja Sans font. + +.TP +\fBxrdp-mkfv1 -C off -p10 /path/to/DejaVuSans.ttf ./sans-10.fv1\fR +Generate a 10-point DajaVu Sans font using natural offsets. + +.SH SEE ALSO +.BR xrdp\-dumpfv1(8). + +More info on \fBxrdp\fR can be found on the +.UR @xrdphomeurl@ +xrdp homepage +.UE diff --git a/fontutils/Makefile.am b/fontutils/Makefile.am new file mode 100644 index 00000000..f9e65ab4 --- /dev/null +++ b/fontutils/Makefile.am @@ -0,0 +1,34 @@ +EXTRA_DIST = windows + +# Some programs need freetype2 to build +if USE_FREETYPE2 + MKFV1 = xrdp-mkfv1 +else + MKFV1 = +endif + +AM_CPPFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir)/common \ + $(FREETYPE2_CFLAGS) + +bin_PROGRAMS = \ + $(MKFV1) \ + xrdp-dumpfv1 + +xrdp_mkfv1_SOURCES = \ + mkfv1.c \ + fv1.c \ + fv1.h + +xrdp_mkfv1_LDADD = \ + $(top_builddir)/common/libcommon.la \ + $(FREETYPE2_LIBS) + +xrdp_dumpfv1_SOURCES = \ + dumpfv1.c \ + fv1.c \ + fv1.h + +xrdp_dumpfv1_LDADD = \ + $(top_builddir)/common/libcommon.la diff --git a/fontutils/dumpfv1.c b/fontutils/dumpfv1.c new file mode 100644 index 00000000..d42c6fcd --- /dev/null +++ b/fontutils/dumpfv1.c @@ -0,0 +1,413 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2022 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * fonts + */ + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include +#include + +#include "list.h" +#include "os_calls.h" +#include "parse.h" +#include "string_calls.h" +#include "fv1.h" + +/** + * What the program is doing + */ +enum program_mode +{ + PM_UNSPECIFIED = 0, + PM_INFO, + PM_GLYPH_INFO_TABLE, + PM_SHOW_CHAR +}; + +/** + * Parsed program arguments + */ +struct program_args +{ + const char *font_file; + enum program_mode mode; + int ucode; /* Unicode character to display in 'c' mode */ +}; + +/**************************************************************************//** + * Parses the program args + * + * @param argc Passed to main + * @param @argv Passed to main + * @param pa program_pargs structure for resulting values + * @return !=0 for success + */ +static int +parse_program_args(int argc, char *argv[], struct program_args *pa) +{ + int params_ok = 1; + int opt; + + pa->font_file = NULL; + pa->mode = PM_UNSPECIFIED; + pa->ucode = 0; + + while ((opt = getopt(argc, argv, "c:it")) != -1) + { + switch (opt) + { + case 'i': + if (pa->mode == PM_UNSPECIFIED) + { + pa->mode = PM_INFO; + } + else + { + LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); + params_ok = 0; + } + break; + + case 't': + if (pa->mode == PM_UNSPECIFIED) + { + pa->mode = PM_GLYPH_INFO_TABLE; + } + else + { + LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); + params_ok = 0; + } + break; + + case 'c': + if (pa->mode == PM_UNSPECIFIED) + { + pa->mode = PM_SHOW_CHAR; + if (toupper(optarg[0]) == 'U' && optarg[1] == '+') + { + char *hex = g_strdup(optarg); + hex[0] = '0'; + hex[1] = 'x'; + pa->ucode = g_atoix(hex); + g_free(hex); + } + else if (optarg[0] == '@') + { + pa->ucode = optarg[1]; + } + else + { + pa->ucode = g_atoix(optarg); + } + } + else + { + LOG(LOG_LEVEL_ERROR, "Can't have two modes set"); + params_ok = 0; + } + break; + + default: + LOG(LOG_LEVEL_ERROR, "Unrecognised switch '%c'", (char)opt); + params_ok = 0; + } + } + + if (argc <= optind) + { + LOG(LOG_LEVEL_ERROR, "No font file specified"); + params_ok = 0; + } + else if ((argc - optind) > 1) + { + LOG(LOG_LEVEL_ERROR, "Unexpected arguments after font file"); + params_ok = 0; + } + else + { + pa->font_file = argv[optind]; + } + + return params_ok; +} + +/**************************************************************************//** + * Displays information about a font file + * + * @param fv1 loaded font file + */ +static void +display_font_file_info(const struct fv1_file *fv1) +{ + g_printf("Font name : %s\n", fv1->font_name); + g_printf("Point size (%d DPI) : %d\n", FV1_DEVICE_DPI, fv1->point_size); + g_printf("Style : %d\n", fv1->style); + if (fv1->body_height == 0 && fv1->glyphs->count > 0) + { + const struct fv1_glyph *g = + (const struct fv1_glyph *)fv1->glyphs->items[0]; + g_printf("Body height : %d (from 1st glyph)\n", -g->baseline + 1); + } + else + { + g_printf("Body height : %d\n", fv1->body_height); + } + g_printf("Descender : %d\n", fv1->min_descender); + + if (fv1->glyphs->count == 0) + { + g_printf("\nFile contains no glyphs\n"); + } + else + { + g_printf("Min glyph index : U+%04X\n", FV1_MIN_CHAR); + g_printf("Max glyph index : U+%04X\n", FV1_GLYPH_END(fv1) - 1); + + /* Work out the statistics */ + unsigned short max_width = 0; + int max_width_ucode = 0; + unsigned short max_height = 0; + int max_height_ucode = 0; + short min_baseline = 0; + int min_baseline_ucode = 0; + short min_offset = 0; + int min_offset_ucode = 0; + short max_offset = 0; + int max_offset_ucode = 0; + unsigned short max_inc_by = 0; + int max_inc_by_ucode = 0; + + /* Derived quantities */ + short min_y_descender = SHRT_MAX; + int min_y_descender_ucode = 0; + int max_datasize = -1; + int max_datasize_ucode = 0; + + /* Loop and output macros */ +#define SET_MIN(ucode,field,val) \ + if ((field) < (val)) \ + { \ + val = (field); \ + val##_ucode = (ucode); \ + } + +#define SET_MAX(ucode,field,val) \ + if ((field) > (val)) \ + { \ + val = (field); \ + val##_ucode = (ucode); \ + } + +#define OUTPUT_INFO(string, val) \ + if (val##_ucode > 0) \ + { \ + g_printf(string, val, val##_ucode); \ + } + int u; + for (u = FV1_MIN_CHAR ; u < FV1_GLYPH_END(fv1); ++u) + { + const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); + if (g != NULL) + { + short y_descender = - (g->baseline + g->height); + int datasize = FONT_DATASIZE(g); + + SET_MAX(u, g->width, max_width); + SET_MAX(u, g->height, max_height); + SET_MIN(u, g->baseline, min_baseline); + SET_MIN(u, g->offset, min_offset); + SET_MAX(u, g->offset, max_offset); + SET_MAX(u, g->inc_by, max_inc_by); + SET_MIN(u, y_descender, min_y_descender); + SET_MAX(u, datasize, max_datasize); + } + } + + OUTPUT_INFO("Max glyph width : %d (U+%04X)\n", max_width); + OUTPUT_INFO("Max glyph height : %d (U+%04X)\n", max_height); + OUTPUT_INFO("Min glyph y-baseline : %d (U+%04X)\n", min_baseline); + OUTPUT_INFO("Min glyph y-descender : %d (U+%04X)\n", min_y_descender); + OUTPUT_INFO("Min glyph x-offset : %d (U+%04X)\n", min_offset); + OUTPUT_INFO("Max glyph x-offset : %d (U+%04X)\n", max_offset); + OUTPUT_INFO("Max glyph x-inc_by : %d (U+%04X)\n", max_inc_by); + OUTPUT_INFO("Max glyph datasize : %d (U+%04X)\n", max_datasize); + +#undef SET_MIN +#undef SET_MAX +#undef OUTPUT_INFO + } +} + +/**************************************************************************//** + * Display info in a table about all the glyphs + * @param fv1 font file + */ +static void +display_glyph_info_table(const struct fv1_file *fv1) +{ + int u; + g_printf("character,width,height,baseline,offset,inc_by,datasize\n"); + + for (u = FV1_MIN_CHAR; u < FV1_GLYPH_END(fv1); ++u) + { + const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); + if (g != NULL) + { + int datasize = FONT_DATASIZE(g); + g_printf("%d,%hu,%hu,%hd,%hd,%hu,%d\n", + u, g->width, g->height, g->baseline, + g->offset, g->inc_by, datasize); + } + } +} + +/**************************************************************************//** + * Converts a font data row to a printable string + * + * @param rowdata Pointer to the first byte of the row data + * @param width Number of pixels in the row + * @param out Output buffer. Must be sized by the caller to be at + * least width+1 bytes + */ +static void +row_to_str(const unsigned char *rowdata, int width, char *out) +{ + int x; + int mask = 1 << 7; + for (x = 0 ; x < width ; ++x) + { + out[x] = ((*rowdata & mask) != 0) ? 'X' : '.'; + mask >>= 1; + if (mask == 0) + { + mask = 1 << 7; + ++rowdata; + } + } + out[width] = '\0'; +} + +/**************************************************************************//** + * Display info about a specific glyph + * @param ucode Unicode character value + * @param g Glyph + */ +static void +display_glyph_info(int ucode, const struct fv1_glyph *g) +{ + + char *row_buffer = (char *)g_malloc(g->width + 1, 0); + if (row_buffer == NULL) + { + g_printf("\n"); + } + else + { + g_printf("Glyph : U+%04X\n", ucode); + g_printf(" Width : %d\n", g->width); + g_printf(" Height : %d\n", g->height); + g_printf(" Baseline : %d\n", g->baseline); + g_printf(" Offset : %d\n", g->offset); + g_printf(" Inc By : %d\n", g->inc_by); + + g_printf(" Data :\n"); + int y; + const unsigned char *dataptr = g->data; + + for (y = 0 ; y < g->height; ++y) + { + row_to_str(dataptr, g->width, row_buffer); + g_printf(" %+3d: %s\n", y + g->baseline, row_buffer); + dataptr += (g->width + 7) / 8; + } + g_free(row_buffer); + } +} + +/**************************************************************************//** + * Main + * + * @param argc Argument count + * @param argv Arguments + */ +int +main(int argc, char *argv[]) +{ + struct fv1_file *fv1 = NULL; + struct log_config *logging; + struct program_args pa; + int rv = 1; + + logging = log_config_init_for_console(LOG_LEVEL_WARNING, + g_getenv("DUMPFV1_LOG_LEVEL")); + log_start_from_param(logging); + log_config_free(logging); + + if (parse_program_args(argc, argv, &pa) && + (fv1 = fv1_file_load(pa.font_file)) != NULL) + { + switch (pa.mode) + { + case PM_INFO: + display_font_file_info(fv1); + rv = 0; + break; + + case PM_GLYPH_INFO_TABLE: + display_glyph_info_table(fv1); + rv = 0; + break; + + case PM_SHOW_CHAR: + if (pa.ucode < FV1_MIN_CHAR) + { + LOG(LOG_LEVEL_ERROR, "Value for -c must be at least U+%04X", + FV1_MIN_CHAR); + } + else if (pa.ucode >= FV1_GLYPH_END(fv1)) + { + LOG(LOG_LEVEL_ERROR, + "Value for -c must be less than U+%04X", + FV1_GLYPH_END(fv1)); + } + else + { + const struct fv1_glyph *g = + (const struct fv1_glyph *) + list_get_item(fv1->glyphs, pa.ucode - FV1_MIN_CHAR); + display_glyph_info(pa.ucode, g); + rv = 0; + } + break; + + default: + LOG(LOG_LEVEL_ERROR, "Specify one of '-i' or '-c'"); + break; + } + } + + fv1_file_free(fv1); + log_end(); + + return rv; +} diff --git a/fontutils/fv1.c b/fontutils/fv1.c new file mode 100644 index 00000000..af154c1d --- /dev/null +++ b/fontutils/fv1.c @@ -0,0 +1,352 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2022 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file fontutils/fv1.c + * @brief Definitions relating to fv1 font files + */ +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include + +#include "list.h" +#include "os_calls.h" +#include "parse.h" +#include "string_calls.h" +#include "fv1.h" + +const static char FV1_SIGNATURE[] = {'F', 'N', 'T', '1'}; + +/*****************************************************************************/ +struct fv1_glyph * +fv1_alloc_glyph(int ucode, + unsigned short width, + unsigned short height) +{ + int datasize = FONT_DATASIZE_FROM_GEOMETRY(width, height); + struct fv1_glyph *glyph = NULL; + char ucode_str[16] = {'\0'}; + if (ucode < 0) + { + g_snprintf(ucode_str, sizeof(ucode_str), "Glyph"); + } + else + { + g_snprintf(ucode_str, sizeof(ucode_str), "Glyph:U+%04X", ucode); + } + + if (datasize < 0 || datasize > FV1_MAX_GLYPH_DATASIZE) + { + + /* shouldn't happen */ + LOG(LOG_LEVEL_ERROR, "%s - datasize %d out of bounds", + ucode_str, datasize); + } + else + { + glyph = (struct fv1_glyph *) + g_malloc( offsetof(struct fv1_glyph, data) + datasize, 1); + + if (glyph == NULL) + { + LOG(LOG_LEVEL_ERROR, "%s - out of memory", ucode_str); + } + else + { + glyph->width = width; + glyph->height = height; + } + } + + return glyph; +} + +/*****************************************************************************/ +struct fv1_file * +fv1_file_create(void) +{ + struct fv1_file *fv1 = (struct fv1_file *)g_new0(struct fv1_file, 1); + if (fv1 == NULL) + { + LOG(LOG_LEVEL_ERROR, "fv1_file_create - out of memory"); + } + else + { + fv1->style = 1; /* Unused at present - compatibility value */ + fv1->glyphs = list_create(); + fv1->glyphs->auto_free = 1; + } + return fv1; +} + +/*****************************************************************************/ +static void +add_glyphs_from_stream(struct fv1_file *fv1, struct stream *s) +{ + unsigned short width; + unsigned short height; + int datasize; + + struct fv1_glyph *glyph; + + while (s_check_rem(s, 4)) + { + in_sint16_le(s, width); + in_sint16_le(s, height); + + datasize = FONT_DATASIZE_FROM_GEOMETRY(width, height); + + if (datasize < 0 || datasize > FV1_MAX_GLYPH_DATASIZE) + { + LOG(LOG_LEVEL_ERROR, + "Font:%s Glyph:%d - datasize %d out of bounds", + fv1->font_name, FV1_GLYPH_END(fv1), datasize); + break; + } + + if (!s_check_rem(s, 6 + 6 + datasize)) + { + LOG(LOG_LEVEL_ERROR, + "Font:%s Glyph:%d - not enough data for glyph", + fv1->font_name, FV1_GLYPH_END(fv1)); + break; + } + + if ((glyph = fv1_alloc_glyph(FV1_GLYPH_END(fv1), width, height)) == NULL) + { + break; + } + + in_sint16_le(s, glyph->baseline); + in_sint16_le(s, glyph->offset); + in_sint16_le(s, glyph->inc_by); + in_uint8s(s, 6); + + in_uint8a(s, glyph->data, datasize); + + list_add_item(fv1->glyphs, (tintptr)glyph); + } +} + +/*****************************************************************************/ +struct fv1_file * +fv1_file_load(const char *filename) +{ + struct fv1_file *fv1 = NULL; + + if (!g_file_exist(filename)) + { + LOG(LOG_LEVEL_ERROR, "Can't find font file %s", filename); + } + else + { + int file_size = g_file_get_size(filename); + if (file_size < FV1_MIN_FILE_SIZE || file_size > FV1_MAX_FILE_SIZE) + { + LOG(LOG_LEVEL_ERROR, "Font file %s has bad size %d", + filename, file_size); + } + else + { + struct stream *s; + int fd; + make_stream(s); + init_stream(s, file_size + 1024); + fd = g_file_open(filename); + + if (fd < 0) + { + LOG(LOG_LEVEL_ERROR, "Can't open font file %s", filename); + } + else + { + int b = g_file_read(fd, s->data, file_size + 1024); + g_file_close(fd); + + if (b < FV1_MIN_FILE_SIZE) + { + LOG(LOG_LEVEL_ERROR, "Font file %s is too small", + filename); + } + else + { + char sig[sizeof(FV1_SIGNATURE)]; + s->end = s->data + b; + in_uint8a(s, sig, sizeof(FV1_SIGNATURE)); + if (g_memcmp(sig, FV1_SIGNATURE, sizeof(sig)) != 0) + { + LOG(LOG_LEVEL_ERROR, + "Font file %s has wrong signature", + filename); + } + else if ((fv1 = fv1_file_create()) != NULL) + { + in_uint8a(s, fv1->font_name, FV1_MAX_FONT_NAME_SIZE); + fv1->font_name[FV1_MAX_FONT_NAME_SIZE] = '\0'; + in_uint16_le(s, fv1->point_size); + in_uint16_le(s, fv1->style); + in_uint16_le(s, fv1->body_height); + in_uint16_le(s, fv1->min_descender); + in_uint8s(s, 4); + + add_glyphs_from_stream(fv1, s); + } + } + } + + free_stream(s); + } + } + + return fv1; +} + +/*****************************************************************************/ +void +fv1_file_free(struct fv1_file *fv1) +{ + if (fv1 != NULL) + { + list_delete(fv1->glyphs); + g_free(fv1); + } +} + +/*****************************************************************************/ +int +write_stream(int fd, struct stream *s) +{ + const char *p = s->data; + int rv = 1; + + while (p < s->end) + { + int len = g_file_write(fd, p, s->end - p); + if (len <= 0) + { + rv = 0; + break; + } + p += len; + } + + return rv; +} + +/*****************************************************************************/ +int +fv1_file_save(const struct fv1_file *fv1, const char *filename) +{ + int fd; + struct fv1_glyph *blank_glyph; /* Needed for bad characters */ + + fd = g_file_open_ex(filename, 0, 1, 1, 1); + int rv = 1; + if (fd < 0) + { + LOG(LOG_LEVEL_ERROR, "Unable to open %s for writing [%s]", filename, + g_get_strerror()); + } + else + { + struct stream *s; + make_stream(s); + init_stream(s, 1024); + + /* Write the header */ + out_uint8a(s, FV1_SIGNATURE, sizeof(FV1_SIGNATURE)); + int len = g_strlen(fv1->font_name); + if (len > FV1_MAX_FONT_NAME_SIZE) + { + len = FV1_MAX_FONT_NAME_SIZE; + } + out_uint8a(s, fv1->font_name, len); + while (len++ < FV1_MAX_FONT_NAME_SIZE) + { + out_uint8(s, '\0'); + } + out_uint16_le(s, fv1->point_size); + out_uint16_le(s, fv1->style); + out_uint16_le(s, fv1->body_height); + out_uint16_le(s, fv1->min_descender); + out_uint8a(s, "\0\0\0\0", 4); + s_mark_end(s); + if (!write_stream(fd, s)) + { + LOG(LOG_LEVEL_ERROR, "Unable to write file header [%s]", + g_get_strerror()); + } + else if ((blank_glyph = fv1_alloc_glyph(-1, 0, 0)) == NULL) + { + LOG(LOG_LEVEL_ERROR, "Unable to allocate blank glyph"); + } + else + { + int u; + + for (u = FV1_MIN_CHAR; u < FV1_GLYPH_END(fv1); ++u) + { + const struct fv1_glyph *g = FV1_GET_GLYPH(fv1, u); + int datasize; + if (g == NULL) + { + LOG(LOG_LEVEL_WARNING, "Glyph %d is not set", u); + g = blank_glyph; + } + else + { + datasize = FONT_DATASIZE(g); + if (datasize > FV1_MAX_GLYPH_DATASIZE) + { + LOG(LOG_LEVEL_WARNING, + "glyph %d datasize %d exceeds max of %d" + " - glyph will be blank", + u, datasize, FV1_MAX_GLYPH_DATASIZE); + g = blank_glyph; + } + } + init_stream(s, 16 + FONT_DATASIZE(g)); + out_uint16_le(s, g->width); + out_uint16_le(s, g->height); + out_uint16_le(s, g->baseline); + out_uint16_le(s, g->offset); + out_uint16_le(s, g->inc_by); + out_uint8a(s, "\0\0\0\0\0\0", 6); + out_uint8a(s, g->data, FONT_DATASIZE(g)); + s_mark_end(s); + + if (!write_stream(fd, s)) + { + LOG(LOG_LEVEL_ERROR, "Unable to write glyph %d [%s]", + u, g_get_strerror()); + break; + } + } + g_free(blank_glyph); + + rv = (u == FV1_GLYPH_END(fv1)) ? 0 : 1; + } + free_stream(s); + g_file_close(fd); + } + + return rv; +} diff --git a/fontutils/fv1.h b/fontutils/fv1.h new file mode 100644 index 00000000..d9bb64c0 --- /dev/null +++ b/fontutils/fv1.h @@ -0,0 +1,100 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2022 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file fontutils/fv1.h + * @brief Definitions relating to fv1 font files + */ +#if !defined(FV1_H) +#define FV1_H + +struct list; + +#define FV1_DEVICE_DPI 96 + +#define FV1_MIN_CHAR 0x20 /* First character value in file */ + +#define FV1_MIN_FILE_SIZE 48 +#define FV1_MAX_FILE_SIZE (10 * 1024 * 1024) +#define FV1_MAX_FONT_NAME_SIZE 32 + +#define FV1_MAX_GLYPH_DATASIZE 512 + +struct fv1_glyph +{ + unsigned short width; /* Width of glyph */ + unsigned short height; /* Height of glyph */ + short baseline; /* Offset from cursor pos to 1st row of glyph */ + short offset; /* Space before glyph (can be -ve) */ + unsigned short inc_by; /* Total width of glyph + spacing */ + /* Standard C++ does not yet support C99 flexible array members */ +#ifdef __cplusplus + unsigned char data[1]; +#else + unsigned char data[]; +#endif +}; + +struct fv1_file +{ + char font_name[FV1_MAX_FONT_NAME_SIZE + 1]; + short point_size; /* Input point size (for reference) */ + short style; + short body_height; /* Body height (pixels) */ + short min_descender; /* Min descender of the glyphs in the font */ + struct list *glyphs; /* Glyphs are struct fv1_glyph * */ + +}; + +/** + * Get a glyph pointer for a unicode character + */ +#define FV1_GET_GLYPH(fv1,ucode) \ + (((ucode) < FV1_MIN_CHAR) \ + ? NULL \ + : (struct fv1_glyph *)list_get_item(fv1->glyphs, (ucode) - FV1_MIN_CHAR)) + +/** + * First glyph not in file + */ +#define FV1_GLYPH_END(fv1) (fv1->glyphs->count + FV1_MIN_CHAR) + +struct fv1_file * +fv1_file_load(const char *filename); + +void +fv1_file_free(struct fv1_file *); + +struct fv1_file * +fv1_file_create(void); + +struct fv1_glyph * +fv1_alloc_glyph(int ucode, /* Unicode character for error reporting if known */ + unsigned short width, + unsigned short height); + +enum fv1_realloc_mode +{ + FV1_AT_TOP, + FV1_AT_BOTTOM +}; + +int +fv1_file_save(const struct fv1_file *fv1, const char *filename); + +#endif diff --git a/fontutils/mkfv1.c b/fontutils/mkfv1.c new file mode 100644 index 00000000..a0cdc337 --- /dev/null +++ b/fontutils/mkfv1.c @@ -0,0 +1,587 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2012 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include +#include +#include FT_FREETYPE_H + +/* See the FT2 documentation - this builds an error table */ +#undef FTERRORS_H_ +#define FT_ERRORDEF( e, v, s ) { e, s }, +#define FT_ERROR_START_LIST { +#define FT_ERROR_END_LIST { 0, NULL } }; + +static const struct +{ + int err_code; + const char *err_msg; +} ft_errors[] = +#include + +#if 0 + /* These lines fix problems with astyle formatting following the ft_errors + * definition */ +} +#endif + + +#include "arch.h" +#include "defines.h" +#include "log.h" +#include "os_calls.h" +#include "string_calls.h" + +#include "fv1.h" + +#define DEFAULT_POINT_SIZE 10 +#define DEFAULT_MAX_CHAR 0x4dff + +/** + * sans10 compatibility choices + */ +enum sans10_compat +{ + S10_OFF = 0, + S10_ON, + S10_AUTO +}; + +/** + * Parsed program arguments + */ +struct program_args +{ + const char *input_file; + const char *output_file; + char font_name[FV1_MAX_FONT_NAME_SIZE + 1]; + unsigned short point_size; + /** Last character value in file */ + unsigned int max_ucode; + /** Are we generating san10 in compatibility mode? */ + enum sans10_compat sans10_compatibility; +}; + +struct x_dimensions +{ + unsigned short width; + short offset; + unsigned short inc_by; +}; + +/** + * Table of some character settings in the original sans-10.fv1 font + */ +static const struct x_dimensions + original_sans10_data[] = +{ + /* 0x20 - 0x3f */ + {1, 0, 4}, {1, 2, 5}, {3, 1, 5}, {9, 1, 11}, + {7, 1, 8}, {11, 0, 12}, {9, 1, 11}, {1, 1, 3}, + {3, 1, 5}, {3, 1, 5}, {7, 0, 7}, {9, 1, 11}, + {2, 1, 4}, {3, 1, 5}, {1, 2, 4}, {4, 0, 4}, + {6, 1, 8}, {5, 2, 8}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {6, 1, 8}, {1, 2, 4}, {2, 1, 4}, + {8, 1, 11}, {8, 1, 11}, {8, 1, 11}, {5, 1, 7}, + /* 0x40 - 0x5f */ + {11, 1, 13}, {9, 0, 9}, {7, 1, 9}, {7, 1, 9}, + {8, 1, 10}, {6, 1, 8}, {5, 1, 7}, {8, 1, 10}, + {8, 1, 10}, {1, 1, 3}, {3, -1, 3}, {7, 1, 8}, + {6, 1, 7}, {9, 1, 11}, {8, 1, 10}, {8, 1, 10}, + {6, 1, 8}, {8, 1, 10}, {7, 1, 8}, {7, 1, 9}, + {7, 0, 7}, {8, 1, 10}, {9, 0, 9}, {11, 0, 11}, + {8, 0, 8}, {7, 0, 7}, {8, 1, 10}, {3, 1, 5}, + {4, 0, 4}, {3, 1, 5}, {8, 1, 11}, {7, 0, 7}, + /* 0x60 - 0x7f */ + {3, 1, 7}, {6, 1, 8}, {6, 1, 8}, {5, 1, 7}, + {6, 1, 8}, {6, 1, 8}, {4, 0, 4}, {6, 1, 8}, + {6, 1, 8}, {1, 1, 3}, {2, 0, 3}, {6, 1, 7}, + {1, 1, 3}, {11, 1, 13}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {6, 1, 8}, {4, 1, 5}, {5, 1, 7}, + {4, 0, 5}, {6, 1, 8}, {7, 0, 7}, {9, 0, 9}, + {7, 0, 7}, {7, 0, 7}, {5, 1, 7}, {5, 2, 8}, + {1, 2, 4}, {5, 2, 8}, {8, 1, 11}, {7, 1, 8}, + /* 0x80 - 0x9f */ + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, {7, 1, 8}, + /* 0xa0 - 0xbf */ + {1, 0, 4}, {1, 2, 5}, {6, 1, 8}, {7, 0, 8}, + {7, 0, 8}, {7, 1, 8}, {1, 2, 4}, {5, 1, 7}, + {3, 2, 7}, {9, 2, 13}, {5, 1, 6}, {6, 1, 8}, + {8, 1, 11}, {3, 1, 5}, {9, 2, 13}, {4, 1, 7}, + {4, 1, 7}, {9, 1, 11}, {4, 1, 5}, {4, 1, 5}, + {3, 2, 7}, {7, 1, 8}, {6, 1, 8}, {1, 1, 4}, + {3, 2, 7}, {3, 1, 5}, {5, 1, 6}, {6, 1, 8}, + {12, 1, 13}, {11, 1, 13}, {12, 1, 13}, {5, 1, 7}, + /* 0xc0 - 0xdf */ + {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, {9, 0, 9}, + {9, 0, 9}, {9, 0, 9}, {12, 0, 13}, {7, 1, 9}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {2, 0, 3}, {2, 1, 3}, {5, -1, 3}, {3, 0, 3}, + {9, 0, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, + {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {7, 2, 11}, + {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, {8, 1, 10}, + {8, 1, 10}, {7, 0, 7}, {6, 1, 8}, {6, 1, 8}, + /* 0xe0 - 0xff */ + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {6, 1, 8}, {11, 1, 13}, {5, 1, 7}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {3, 0, 3}, {3, 1, 3}, {5, -1, 3}, {3, 0, 3}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {8, 1, 11}, + {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, {6, 1, 8}, + {6, 1, 8}, {7, 0, 7}, {6, 1, 8}, {7, 0, 7} +}; + + +/**************************************************************************//** + * Parses a unicode character value + * + * @param str String containing value + * @return Resulting character value + */ +static unsigned int +parse_ucode_name(const char *str) +{ + unsigned int rv; + if (toupper(str[0]) == 'U' && str[1] == '+') + { + char *hex = g_strdup(str); + hex[0] = '0'; + hex[1] = 'x'; + rv = g_atoix(hex); + g_free(hex); + } + else if (str[0] == '@') + { + rv = str[1]; + } + else + { + rv = g_atoix(str); + } + return rv; +} + +/**************************************************************************//** + * Parses the program args + * + * @param argc Passed to main + * @param @argv Passed to main + * @param pa program_pargs structure for resulting values + * @return !=0 for success + */ +static int +parse_program_args(int argc, char *argv[], struct program_args *pa) +{ + int params_ok = 1; + int opt; + + pa->input_file = NULL; + pa->output_file = NULL; + pa->font_name[0] = '\0'; + pa->point_size = DEFAULT_POINT_SIZE; + pa->max_ucode = DEFAULT_MAX_CHAR; + pa->sans10_compatibility = S10_AUTO; + + while ((opt = getopt(argc, argv, "n:p:m:C:")) != -1) + { + switch (opt) + { + case 'n': + g_snprintf(pa->font_name, FV1_MAX_FONT_NAME_SIZE + 1, "%s", + optarg); + break; + + case 'p': + pa->point_size = g_atoi(optarg); + break; + + case 'm': + pa->max_ucode = parse_ucode_name(optarg); + break; + + case 'C': + if (toupper(optarg[0]) == 'A') + { + pa->sans10_compatibility = S10_AUTO; + } + else if (g_text2bool(optarg)) + { + pa->sans10_compatibility = S10_ON; + } + else + { + pa->sans10_compatibility = S10_OFF; + } + break; + + default: + LOG(LOG_LEVEL_ERROR, "Unrecognised switch '%c'", (char)opt); + params_ok = 0; + } + } + + if (pa->max_ucode < FV1_MIN_CHAR) + { + LOG(LOG_LEVEL_ERROR, "-m argument must be at least %d", + FV1_MIN_CHAR); + params_ok = 0; + } + + switch (argc - optind) + { + case 0: + LOG(LOG_LEVEL_ERROR, "No input file specified"); + params_ok = 0; + break; + + case 1: + LOG(LOG_LEVEL_ERROR, "No output file specified"); + params_ok = 0; + break; + case 2: + pa->input_file = argv[optind]; + pa->output_file = argv[optind + 1]; + break; + + default: + LOG(LOG_LEVEL_ERROR, "Unexpected arguments after output file"); + params_ok = 0; + } + + return params_ok; +} + +/**************************************************************************//** + * Checks whether the specified glyph row is blank + * @param g Glyph + * @param row Row number between 0 and g->height - 1 + * @result Boolean + */ +static int +is_blank_glyph_row(const struct fv1_glyph *g, unsigned int row) +{ + if (g->width == 0 || row >= g->height) + { + return 1; + } + + const unsigned int glyph_row_size = ((g->width + 7) / 8); + const unsigned char *dataptr = g->data + (row * glyph_row_size); + const unsigned int masks[] = + { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; + + /* Check for set pixels in all the leading bytes */ + unsigned int x; + for (x = g->width ; x > 8 ; x -= 8) + { + if (*dataptr++ != 0) + { + return 0; + } + } + + /* Use a single test to check the pixels in the last byte */ + return ((*dataptr & masks[x - 1]) == 0); +} + +/**************************************************************************//** + * Returns a string for a freetype2 error + * @param error Freetype2 error code + * @param buff Pointer to buffer for error string + * @param bufflen Length of above + */ +static void +get_ft_error(FT_Error error, char *buff, unsigned int bufflen) +{ + const char *errstr = NULL; + unsigned int i; + for (i = 0 ; i < (sizeof(ft_errors) / sizeof(ft_errors[0])); ++i) + { + if (ft_errors[i].err_code == error) + { + errstr = ft_errors[i].err_msg; + break; + } + } + + if (errstr != NULL) + { + g_snprintf(buff, bufflen, "[%s]", errstr); + } + else + { + g_snprintf(buff, bufflen, + "[errorcode %d (no description)]", (int)error); + } +} + +/**************************************************************************//** + * Implement sans10 compatibility for a glyph + * + * The original Windows font generator made a few different choices for the + * character x offset than freetype2 does. These are particularly noticeable + * with a small font. + * + * This routine checks the glyph, and implements the original offset size + * for popular English characters, which are all that the user will probably + * be displaying with xrdp v0.9.x + * + * @param g Glyph to check + */ +static void +implement_sans10_compatibility(struct fv1_glyph *g, unsigned int ucode) +{ + const unsigned int max_index = + sizeof(original_sans10_data) / sizeof(original_sans10_data[0]); + + if (ucode < FV1_MIN_CHAR || ucode >= max_index + FV1_MIN_CHAR) + { + return; + } + + const struct x_dimensions *d = + &original_sans10_data[ucode - FV1_MIN_CHAR]; + + if (g->offset != d->offset) + { + if (g->width != d->width) + { + LOG(LOG_LEVEL_WARNING, + "Can't set compatibility offset for U+%04X: width %d != %d", + ucode, g->width, d->width); + } + else if (g->inc_by != d->inc_by) + { + LOG(LOG_LEVEL_WARNING, + "Can't set compatibility offset for U+%04X: inc_by %d != %d", + ucode, g->inc_by, d->inc_by); + } + else + { + LOG(LOG_LEVEL_INFO, + "Changing compatibility offset for U+%04X: from %d to %d", + ucode, g->offset, d->offset); + } + + g->offset = d->offset; + } +} + +/**************************************************************************//** + * Converts a freetype 2 bitmap to a fv1 glyph + * @param ft_glyph Freetype2 glyph. Must be a monochrome bitmap + * @param ucode Unicode character for error reporting + * @param pa Program args + * @return fv1 glyph, or NULL for error + */ +static struct fv1_glyph * +convert_mono_glyph(FT_GlyphSlot ft_glyph, unsigned int ucode, + const struct program_args *pa) +{ + short width = ft_glyph->bitmap.width; + short height = ft_glyph->bitmap.rows; + struct fv1_glyph *g; + + /* Number of bytes in a glyph row */ + const unsigned int glyph_row_size = ((width + 7) / 8); + + if ((g = fv1_alloc_glyph(ucode, width, height)) != NULL) + { + g->baseline = -(ft_glyph->metrics.horiBearingY / 64); + g->offset = ft_glyph->metrics.horiBearingX / 64; + g->inc_by = ft_glyph->metrics.horiAdvance / 64; + + if (FONT_DATASIZE(g) > 0) + { + const unsigned char *srcptr = ft_glyph->bitmap.buffer; + unsigned char *dstptr = g->data; + unsigned int y; + + for (y = 0; y < g->height; ++y) + { + g_memcpy(dstptr, srcptr, glyph_row_size); + dstptr += glyph_row_size; + srcptr += ft_glyph->bitmap.pitch; + } + + /* Optimise the glyph by removing any blank lines at the bottom + * and top */ + if (g->width > 0) + { + while (g->height > 0 && + is_blank_glyph_row(g, g->height - 1)) + { + --g->height; + } + + y = 0; + while (y < g->height && is_blank_glyph_row(g, y)) + { + ++y; + } + + if (y > 0) + { + g->baseline += y; + g->height -= y; + g_memmove(g->data, g->data + (y * glyph_row_size), + g->height * glyph_row_size); + } + } + } + } + + if (pa->sans10_compatibility != S10_OFF) + { + implement_sans10_compatibility(g, ucode); + } + + return g; +} + +/**************************************************************************//** + * Main + * + * @param argc Argument count + * @param argv Arguments + */ +int +main(int argc, char *argv[]) +{ + FT_Library library = NULL; /* handle to library */ + FT_Face face = NULL; /* handle to face object */ + FT_Error error; + struct fv1_glyph *g; + struct program_args pa; + struct log_config *logging; + int rv = 1; + + logging = log_config_init_for_console(LOG_LEVEL_WARNING, + g_getenv("MKFV1_LOG_LEVEL")); + log_start_from_param(logging); + log_config_free(logging); + + struct fv1_file *fv1 = fv1_file_create(); + + if (fv1 == NULL) + { + LOG(LOG_LEVEL_ERROR, "Memory allocation failure"); + } + else if (parse_program_args(argc, argv, &pa)) + { + char errstr[128]; + + if ((error = FT_Init_FreeType(&library)) != 0) + { + get_ft_error(error, errstr, sizeof(errstr)); + LOG(LOG_LEVEL_ERROR, "Error initializing freetype library %s", + errstr); + } + else if ((error = FT_New_Face(library, pa.input_file, 0, &face)) != 0) + { + get_ft_error(error, errstr, sizeof(errstr)); + LOG(LOG_LEVEL_ERROR, "Error loading font file %s %s", + pa.input_file, errstr); + } + else if ((error = FT_Set_Char_Size(face, 0, + pa.point_size * 64, + FV1_DEVICE_DPI, 0)) != 0) + { + get_ft_error(error, errstr, sizeof(errstr)); + LOG(LOG_LEVEL_ERROR, "Error setting point size to %u %s", + pa.point_size, errstr); + } + else + { + const char *fname = + (pa.font_name[0] != '\0') ? pa.font_name : + (face->family_name != NULL) ? face->family_name : + /* Default */ ""; + + g_snprintf(fv1->font_name, FV1_MAX_FONT_NAME_SIZE + 1, "%s", fname); + fv1->point_size = pa.point_size; + fv1->body_height = face->size->metrics.height / 64; + fv1->min_descender = face->size->metrics.descender / 64; + + if (pa.sans10_compatibility == S10_AUTO) + { + if (g_strcmp(fv1->font_name, "DejaVu Sans") == 0 && + fv1->point_size == 10) + { + pa.sans10_compatibility = S10_ON; + } + else + { + pa.sans10_compatibility = S10_OFF; + } + } + + unsigned int u; + for (u = FV1_MIN_CHAR; u <= pa.max_ucode; ++u) + { + /* retrieve glyph index from character code */ + FT_UInt glyph_index = FT_Get_Char_Index(face, u); + + /* load glyph image into the slot (erase previous one) */ + error = FT_Load_Glyph(face, glyph_index, + FT_LOAD_RENDER | FT_LOAD_TARGET_MONO); + if (error) + { + get_ft_error(error, errstr, sizeof(errstr)); + LOG(LOG_LEVEL_WARNING, + "Unable to get bitmap for U+%04X %s", u, errstr); + g = NULL; + } + else if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP || + face->glyph->bitmap.pixel_mode != FT_PIXEL_MODE_MONO) + { + LOG(LOG_LEVEL_WARNING, + "Internal error; U+%04X was not loaded as a bitmap", + u); + g = NULL; + } + else + { + g = convert_mono_glyph(face->glyph, u, &pa); + } + list_add_item(fv1->glyphs, (tintptr)g); + } + + rv = fv1_file_save(fv1, pa.output_file); + } + } + + FT_Done_FreeType(library); + fv1_file_free(fv1); + log_end(); + + return rv; +} diff --git a/fontdump/.gitignore b/fontutils/windows/.gitignore similarity index 100% rename from fontdump/.gitignore rename to fontutils/windows/.gitignore diff --git a/fontdump/Makefile b/fontutils/windows/Makefile similarity index 100% rename from fontdump/Makefile rename to fontutils/windows/Makefile diff --git a/fontdump/fontdump.c b/fontutils/windows/fontdump.c similarity index 100% rename from fontdump/fontdump.c rename to fontutils/windows/fontdump.c From 90561f7bad25d6274b41d2a7a4ba71252d51ef6f Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:56:18 +0100 Subject: [PATCH 5/9] Added fontutils/README_fv1.txt --- fontutils/README_fv1.txt | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 fontutils/README_fv1.txt diff --git a/fontutils/README_fv1.txt b/fontutils/README_fv1.txt new file mode 100644 index 00000000..2b8c3bba --- /dev/null +++ b/fontutils/README_fv1.txt @@ -0,0 +1,87 @@ +The fv1 font format has the following characteristics:- + +1) Bitmap fonts (i.e. pixels are on or off) +2) 96 DPI is assumed +3) Glyphs from U+0020 up to a pre-defined limit are stored in the file. + At the time of writing this limit is U+4DFF. To change the limit + requires a change to xrdp/xrdp_types.h and (potentially) + fontutils/mkfv1.c +4) Font format is header, plus a variable data area for each glyph. + +The intention (over time) is to build support for the freetype2 library +directly into xrdp. This will allow for modern font features like +anti-aliasing and kerning to be supported. + +General Info +------------ +All numeric values are 2 octets, and stored in twos-complement +little-endian format. + +Dimensions are all measured in pixels. + +Font header +----------- + +signature 4 octets File signature - "FNT1" +font~name 32 octets Null-terminated if less that 32 octets long +point_size 2 octets Assumes 96 DPI. +style 2 octets Unused. Set to 1. +body_height 2 octets Line spacing for font. +min_descender 2 octets The common lowest descender value in the font + glyphs (A few glyphs may be lower than + this). Used to calculate where the font baseline + is in relation to the text box for the font. + 4 octets Set to zero. + +Older fonts, generated for xrdp v.0.9x and earlier, have zero values +for the body_height and min_descender. For these fonts, the body height is +calculated as (-baseline + 1) for the first glyph, and the glyphs are +all offset so that a min_descender of 0 works OK. + +Glyph data +---------- +The header is followed by a number of glyphs representing U+0020 upwards. The +glyphs have a variable size. The format of each glyph is as follows:- + +width 2 octets Width of character data +height 2 octets Height of character data +baseline 2 octets Offset from font baseline to 1st row of glyph data +offset 2 octets Space before glyph is drawn (can be -ve) +inc_by 2 octets Total width of glyph + spacing. The width of + a string is obtained by adding up all the inc_by + fields for all the glyphs +data Bitmap data. + +Bitmap data is laid out in rows from top to bottom. Within each row the +most significant bit of each octet is on the left. Row data is padded +to the nearest octet (e.g. a 14 bit width would be padded by 2 bits to +16 bits (2 octets). The total data is padded out with between 0 and 3 +octets to end on a 4-octet boundary. + +Example glyph:- + +Glyph : U+0067 + Width : 12 + Height : 18 + Baseline : -13 + Offset : 1 + Inc By : 15 + Data : + -13: ...XXXXX..XX 1F 30 + -12: ..XXXXXXXXXX 3F F0 + -11: .XXX....XXXX 70 F0 + -10: XXX......XXX E0 70 + -9: XX........XX C0 30 + -8: XX........XX C0 30 + -7: XX........XX C0 30 + -6: XX........XX C0 30 + -5: XX........XX C0 30 + -4: XXX......XXX E0 70 + -3: .XXX....XXXX 70 F0 + -2: ..XXXXXXXXXX 3F F0 + -1: ...XXXXX..XX 1F 30 + +0: ..........XX 00 30 + +1: .........XXX 00 70 + +2: ..X.....XXX. 20 E0 + +3: ..XXXXXXXX.. 3F C0 + +4: ...XXXXXX... 1F 80 From 36959e593acab22ce6f33eee312d7412097e6270 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:10:07 +0100 Subject: [PATCH 6/9] Add support for new fields in fv1 fonts The previous commit added utilities which work with fv1 files with additional fields in the fv1 header (i.e. body_height and min_descender). This commit makes minor changes to the font loading code in xrdp so xrdp can read the new font format. --- xrdp/xrdp_font.c | 68 +++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/xrdp/xrdp_font.c b/xrdp/xrdp_font.c index cc6670d0..5813b361 100644 --- a/xrdp/xrdp_font.c +++ b/xrdp/xrdp_font.c @@ -18,23 +18,7 @@ * fonts */ -/* - The fv1 files contain - Font File Header (just one) - FNT1 4 bytes - Font Name 32 bytes - Font Size 2 bytes - Font Style 2 bytes - Pad 8 bytes - Font Data (repeats) - Width 2 bytes - Height 2 bytes - Baseline 2 bytes - Offset 2 bytes - Incby 2 bytes - Pad 6 bytes - Glyph Data var, see FONT_DATASIZE macro -*/ +/* fv1 files are described in fontutils/README_fv1.txt */ #if defined(HAVE_CONFIG_H) #include @@ -46,22 +30,22 @@ #if 0 /* not used */ static char w_char[] = { - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x08, 0x20, 0x80, - 0x08, 0x50, 0x80, - 0x04, 0x51, 0x00, - 0x04, 0x51, 0x00, - 0x04, 0x51, 0x00, - 0x02, 0x8a, 0x00, - 0x02, 0x8a, 0x00, - 0x02, 0x8a, 0x00, - 0x01, 0x04, 0x00, - 0x01, 0x04, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, // ........................ + 0x00, 0x00, 0x00, // ........................ + 0x00, 0x00, 0x00, // ........................ + 0x08, 0x20, 0x80, // ....X.....X.....X....... + 0x08, 0x50, 0x80, // ....X....X.X....X....... + 0x04, 0x51, 0x00, // .....X...X.X...X........ + 0x04, 0x51, 0x00, // .....X...X.X...X........ + 0x04, 0x51, 0x00, // .....X...X.X...X........ + 0x02, 0x8a, 0x00, // ......X.X...X.X......... + 0x02, 0x8a, 0x00, // ......X.X...X.X......... + 0x02, 0x8a, 0x00, // ......X.X...X.X......... + 0x01, 0x04, 0x00, // .......X.....X.......... + 0x01, 0x04, 0x00, // .......X.....X.......... + 0x00, 0x00, 0x00, // ........................ + 0x00, 0x00, 0x00, // ........................ + 0x00, 0x00, 0x00, // ........................ }; #endif @@ -78,6 +62,7 @@ xrdp_font_create(struct xrdp_wm *wm) int datasize; int file_size; struct xrdp_font_char *f; + int min_descender; char file_path[256]; LOG_DEVEL(LOG_LEVEL_TRACE, "in xrdp_font_create"); @@ -117,7 +102,9 @@ xrdp_font_create(struct xrdp_wm *wm) in_uint8a(s, self->name, 32); in_uint16_le(s, self->size); in_uint16_le(s, self->style); - in_uint8s(s, 8); + in_uint16_le(s, self->body_height); + in_sint16_le(s, min_descender); + in_uint8s(s, 4); index = 32; while (s_check_rem(s, 16)) @@ -128,7 +115,8 @@ xrdp_font_create(struct xrdp_wm *wm) in_sint16_le(s, i); f->height = i; in_sint16_le(s, i); - f->baseline = i; + /* Move the glyph up so there are no descenders */ + f->baseline = i + min_descender; in_sint16_le(s, i); f->offset = i; in_sint16_le(s, i); @@ -145,7 +133,15 @@ xrdp_font_create(struct xrdp_wm *wm) break; } - if (s_check_rem(s, datasize)) + if (datasize == 0) + { + /* Allocate a single blank pixel for the glyph, so + * that it can be added to the glyph cache if required */ + f->width = 1; + f->height = 1; + f->data = (char *)g_malloc(1, 1); + } + else if (s_check_rem(s, datasize)) { f->data = (char *)g_malloc(datasize, 0); in_uint8a(s, f->data, datasize); From d0c8e28d273c9fb849ba27ac68ca84deabe4a32a Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:31:50 +0100 Subject: [PATCH 7/9] Add a scaling capability to the login screen The dimensions from xrdp.ini are replaced with scaled and unscaled versions. The unscaled versions are read from the config file, and then scaled to match the loaded font. Currently this has no significant effect, as the same font is still loaded, so the scaling factor is 1.00. However, when a different font is loaded, the login window can be made larger for use on higher DPI monitors. --- xrdp/xrdp.h | 3 + xrdp/xrdp_login_wnd.c | 272 +++++++++++++++++++++++++++++------------- xrdp/xrdp_types.h | 69 ++++++----- xrdp/xrdp_wm.c | 29 +++-- 4 files changed, 256 insertions(+), 117 deletions(-) diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index d6d66b78..a769f987 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -391,6 +391,9 @@ int xrdp_login_wnd_create(struct xrdp_wm *self); int load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp); +void +xrdp_login_wnd_scale_config_values(struct xrdp_wm *self); + /* xrdp_bitmap_compress.c */ int diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 8bc04d15..d11287c5 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -159,9 +159,23 @@ xrdp_wm_help_clicked(struct xrdp_bitmap *wnd) { struct xrdp_bitmap *help; struct xrdp_bitmap *but; + const int width = + wnd->wm->xrdp_config->cfg_globals.ls_scaled.help_wnd_width; + const int height = + wnd->wm->xrdp_config->cfg_globals.ls_scaled.help_wnd_height; + const int ok_height = + wnd->wm->xrdp_config->cfg_globals.ls_scaled.default_btn_height; + const char *ok_string = "OK"; + + /* Get a width for the OK button */ + struct xrdp_painter *p = xrdp_painter_create(wnd->wm, wnd->wm->session); + xrdp_painter_font_needed(p); + const int ok_width = xrdp_painter_text_width(p, ok_string) + + DEFAULT_BUTTON_MARGIN_W; + xrdp_painter_delete(p); /* create help screen */ - help = xrdp_bitmap_create(DEFAULT_WND_HELP_W, DEFAULT_WND_HELP_H, wnd->wm->screen->bpp, + help = xrdp_bitmap_create(width, height, wnd->wm->screen->bpp, WND_TYPE_WND, wnd->wm); list_insert_item(wnd->wm->screen->child_list, 0, (long)help); help->parent = wnd->wm->screen; @@ -173,16 +187,16 @@ xrdp_wm_help_clicked(struct xrdp_bitmap *wnd) help->notify = xrdp_wm_login_help_notify; set_string(&help->caption1, "Login help"); /* ok button */ - but = xrdp_bitmap_create(DEFAULT_BUTTON_W, DEFAULT_BUTTON_H, wnd->wm->screen->bpp, + but = xrdp_bitmap_create(ok_width, ok_height, wnd->wm->screen->bpp, WND_TYPE_BUTTON, wnd->wm); list_insert_item(help->child_list, 0, (long)but); but->parent = help; but->owner = help; - but->left = ((DEFAULT_WND_HELP_W / 2) - (DEFAULT_BUTTON_W / 2)); /* center */ - but->top = DEFAULT_WND_HELP_H - DEFAULT_BUTTON_H - 15; + but->left = ((help->width / 2) - (ok_width / 2)); /* center */ + but->top = help->height - ok_height - 15; but->id = 1; but->tab_stop = 1; - set_string(&but->caption1, "OK"); + set_string(&but->caption1, ok_string); /* draw it */ help->focused_control = but; help->default_button = but; @@ -399,32 +413,40 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) } else if (g_strncmp(ASK, value, ASK_LEN) == 0) { + const int combo_height = + self->xrdp_config->cfg_globals.ls_scaled.combo_height; + const int edit_height = + self->xrdp_config->cfg_globals.ls_scaled.edit_height; /* label */ - b = xrdp_bitmap_create(globals->ls_label_width, DEFAULT_EDIT_H, self->screen->bpp, + b = xrdp_bitmap_create(globals->ls_scaled.label_width, + edit_height, self->screen->bpp, WND_TYPE_LABEL, self); list_insert_item(self->login_window->child_list, insert_index, (long)b); insert_index++; b->parent = self->login_window; b->owner = self->login_window; - b->left = globals->ls_label_x_pos; + b->left = globals->ls_scaled.label_x_pos; - b->top = globals->ls_input_y_pos + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; + b->top = globals->ls_scaled.input_y_pos + combo_height + 5 + + (edit_height + 5) * count; b->id = 100 + 2 * count; name = (char *)list_get_item(mod->names, index); set_string(&b->caption1, name); /* edit */ - b = xrdp_bitmap_create(globals->ls_input_width, DEFAULT_EDIT_H, self->screen->bpp, + b = xrdp_bitmap_create(globals->ls_scaled.input_width, + edit_height, self->screen->bpp, WND_TYPE_EDIT, self); list_insert_item(self->login_window->child_list, insert_index, (long)b); insert_index++; b->parent = self->login_window; b->owner = self->login_window; - b->left = globals->ls_input_x_pos; + b->left = globals->ls_scaled.input_x_pos; - b->top = globals->ls_input_y_pos + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; + b->top = globals->ls_scaled.input_y_pos + combo_height + 5 + + (edit_height + 5) * count; b->id = 100 + 2 * count + 1; b->pointer = 1; @@ -669,6 +691,10 @@ xrdp_login_wnd_create(struct xrdp_wm *self) int y; int cx; int cy; + const int combo_height = + self->xrdp_config->cfg_globals.ls_scaled.combo_height; + const int edit_height = + self->xrdp_config->cfg_globals.ls_scaled.edit_height; globals = &self->xrdp_config->cfg_globals; @@ -677,8 +703,8 @@ xrdp_login_wnd_create(struct xrdp_wm *self) primary_x_offset = primary_width / 2; primary_y_offset = primary_height / 2; - log_width = globals->ls_width; - log_height = globals->ls_height; + log_width = globals->ls_scaled.width; + log_height = globals->ls_scaled.height; regular = 1; if (self->screen->width < log_width) @@ -823,58 +849,61 @@ xrdp_login_wnd_create(struct xrdp_wm *self) xrdp_bitmap_load(but, globals->ls_logo_filename, self->palette, globals->ls_bg_color, globals->ls_logo_transform, - globals->ls_logo_width, - globals->ls_logo_height); + globals->ls_scaled.logo_width, + globals->ls_scaled.logo_height); but->parent = self->login_window; but->owner = self->login_window; - but->left = globals->ls_logo_x_pos; - but->top = globals->ls_logo_y_pos; + but->left = globals->ls_scaled.logo_x_pos; + but->top = globals->ls_scaled.logo_y_pos; list_add_item(self->login_window->child_list, (long)but); } /* label */ - but = xrdp_bitmap_create(globals->ls_label_width, DEFAULT_EDIT_H, self->screen->bpp, WND_TYPE_LABEL, self); + but = xrdp_bitmap_create(globals->ls_scaled.label_width, edit_height, + self->screen->bpp, WND_TYPE_LABEL, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = globals->ls_label_x_pos; - but->top = globals->ls_input_y_pos; + but->left = globals->ls_scaled.label_x_pos; + but->top = globals->ls_scaled.input_y_pos; set_string(&but->caption1, "Session"); /* combo */ - combo = xrdp_bitmap_create(globals->ls_input_width, DEFAULT_COMBO_H, + combo = xrdp_bitmap_create(globals->ls_scaled.input_width, combo_height, self->screen->bpp, WND_TYPE_COMBO, self); list_add_item(self->login_window->child_list, (long)combo); combo->parent = self->login_window; combo->owner = self->login_window; - combo->left = globals->ls_input_x_pos; - combo->top = globals->ls_input_y_pos; + combo->left = globals->ls_scaled.input_x_pos; + combo->top = globals->ls_scaled.input_y_pos; combo->id = 6; combo->tab_stop = 1; xrdp_wm_login_fill_in_combo(self, combo); /* OK button */ - but = xrdp_bitmap_create(globals->ls_btn_ok_width, globals->ls_btn_ok_height, + but = xrdp_bitmap_create(globals->ls_scaled.btn_ok_width, + globals->ls_scaled.btn_ok_height, self->screen->bpp, WND_TYPE_BUTTON, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = globals->ls_btn_ok_x_pos; - but->top = globals->ls_btn_ok_y_pos; + but->left = globals->ls_scaled.btn_ok_x_pos; + but->top = globals->ls_scaled.btn_ok_y_pos; but->id = 3; set_string(&but->caption1, "OK"); but->tab_stop = 1; self->login_window->default_button = but; /* Cancel button */ - but = xrdp_bitmap_create(globals->ls_btn_cancel_width, - globals->ls_btn_cancel_height, self->screen->bpp, + but = xrdp_bitmap_create(globals->ls_scaled.btn_cancel_width, + globals->ls_scaled.btn_cancel_height, + self->screen->bpp, WND_TYPE_BUTTON, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = globals->ls_btn_cancel_x_pos; - but->top = globals->ls_btn_cancel_y_pos; + but->left = globals->ls_scaled.btn_cancel_x_pos; + but->top = globals->ls_scaled.btn_cancel_y_pos; but->id = 2; set_string(&but->caption1, "Cancel"); but->tab_stop = 1; @@ -960,27 +989,38 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) /* set default values in case we can't get them from xrdp.ini file */ globals->ini_version = 1; + globals->ls_top_window_bg_color = HCOLOR(bpp, xrdp_wm_htoi("009cb5")); globals->ls_bg_color = HCOLOR(bpp, xrdp_wm_htoi("dedede")); - globals->ls_width = 350; - globals->ls_height = 350; + globals->ls_unscaled.width = 350; + globals->ls_unscaled.height = 350; globals->ls_background_transform = XBLT_NONE; globals->ls_logo_transform = XBLT_NONE; - globals->ls_logo_x_pos = 63; - globals->ls_logo_y_pos = 50; - globals->ls_label_x_pos = 30; - globals->ls_label_width = 65; - globals->ls_input_x_pos = 110; - globals->ls_input_width = 210; - globals->ls_input_y_pos = 150; - globals->ls_btn_ok_x_pos = 150; - globals->ls_btn_ok_y_pos = 300; - globals->ls_btn_ok_width = 85; - globals->ls_btn_ok_height = 30; - globals->ls_btn_cancel_x_pos = 245; - globals->ls_btn_cancel_y_pos = 300; - globals->ls_btn_cancel_width = 85; - globals->ls_btn_cancel_height = 30; + globals->ls_unscaled.logo_x_pos = 63; + globals->ls_unscaled.logo_y_pos = 50; + globals->ls_unscaled.label_x_pos = 30; + globals->ls_unscaled.label_width = 65; + globals->ls_unscaled.input_x_pos = 110; + globals->ls_unscaled.input_width = 210; + globals->ls_unscaled.input_y_pos = 150; + globals->ls_unscaled.btn_ok_x_pos = 150; + globals->ls_unscaled.btn_ok_y_pos = 300; + globals->ls_unscaled.btn_ok_width = 85; + globals->ls_unscaled.btn_ok_height = 30; + globals->ls_unscaled.btn_cancel_x_pos = 245; + globals->ls_unscaled.btn_cancel_y_pos = 300; + globals->ls_unscaled.btn_cancel_width = 85; + globals->ls_unscaled.btn_cancel_height = 30; + globals->ls_unscaled.default_btn_height = + DEFAULT_FONT_PIXEL_SIZE + DEFAULT_BUTTON_MARGIN_H; + globals->ls_unscaled.log_wnd_width = DEFAULT_WND_LOG_W; + globals->ls_unscaled.log_wnd_height = DEFAULT_WND_LOG_H; + globals->ls_unscaled.edit_height = + DEFAULT_FONT_PIXEL_SIZE + DEFAULT_EDIT_MARGIN_H; + globals->ls_unscaled.combo_height = + DEFAULT_FONT_PIXEL_SIZE + DEFAULT_COMBO_MARGIN_H; + globals->ls_unscaled.help_wnd_width = DEFAULT_WND_HELP_W; + globals->ls_unscaled.help_wnd_height = DEFAULT_WND_HELP_H; /* open xrdp.ini file */ if ((fd = g_file_open(xrdp_ini)) < 0) @@ -1184,12 +1224,12 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) else if (g_strncmp(n, "ls_width", 64) == 0) { - globals->ls_width = g_atoi(v); + globals->ls_unscaled.width = g_atoi(v); } else if (g_strncmp(n, "ls_height", 64) == 0) { - globals->ls_height = g_atoi(v); + globals->ls_unscaled.height = g_atoi(v); } else if (g_strncmp(n, "ls_bg_color", 64) == 0) @@ -1228,87 +1268,87 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) else if (g_strncmp(n, "ls_logo_width", 64) == 0) { - globals->ls_logo_width = g_atoi(v); + globals->ls_unscaled.logo_width = g_atoi(v); } else if (g_strncmp(n, "ls_logo_height", 64) == 0) { - globals->ls_logo_height = g_atoi(v); + globals->ls_unscaled.logo_height = g_atoi(v); } else if (g_strncmp(n, "ls_logo_x_pos", 64) == 0) { - globals->ls_logo_x_pos = g_atoi(v); + globals->ls_unscaled.logo_x_pos = g_atoi(v); } else if (g_strncmp(n, "ls_logo_y_pos", 64) == 0) { - globals->ls_logo_y_pos = g_atoi(v); + globals->ls_unscaled.logo_y_pos = g_atoi(v); } else if (g_strncmp(n, "ls_label_x_pos", 64) == 0) { - globals->ls_label_x_pos = g_atoi(v); + globals->ls_unscaled.label_x_pos = g_atoi(v); } else if (g_strncmp(n, "ls_label_width", 64) == 0) { - globals->ls_label_width = g_atoi(v); + globals->ls_unscaled.label_width = g_atoi(v); } else if (g_strncmp(n, "ls_input_x_pos", 64) == 0) { - globals->ls_input_x_pos = g_atoi(v); + globals->ls_unscaled.input_x_pos = g_atoi(v); } else if (g_strncmp(n, "ls_input_width", 64) == 0) { - globals->ls_input_width = g_atoi(v); + globals->ls_unscaled.input_width = g_atoi(v); } else if (g_strncmp(n, "ls_input_y_pos", 64) == 0) { - globals->ls_input_y_pos = g_atoi(v); + globals->ls_unscaled.input_y_pos = g_atoi(v); } else if (g_strncmp(n, "ls_btn_ok_x_pos", 64) == 0) { - globals->ls_btn_ok_x_pos = g_atoi(v); + globals->ls_unscaled.btn_ok_x_pos = g_atoi(v); } else if (g_strncmp(n, "ls_btn_ok_y_pos", 64) == 0) { - globals->ls_btn_ok_y_pos = g_atoi(v); + globals->ls_unscaled.btn_ok_y_pos = g_atoi(v); } else if (g_strncmp(n, "ls_btn_ok_width", 64) == 0) { - globals->ls_btn_ok_width = g_atoi(v); + globals->ls_unscaled.btn_ok_width = g_atoi(v); } else if (g_strncmp(n, "ls_btn_ok_height", 64) == 0) { - globals->ls_btn_ok_height = g_atoi(v); + globals->ls_unscaled.btn_ok_height = g_atoi(v); } else if (g_strncmp(n, "ls_btn_cancel_x_pos", 64) == 0) { - globals->ls_btn_cancel_x_pos = g_atoi(v); + globals->ls_unscaled.btn_cancel_x_pos = g_atoi(v); } else if (g_strncmp(n, "ls_btn_cancel_y_pos", 64) == 0) { - globals->ls_btn_cancel_y_pos = g_atoi(v); + globals->ls_unscaled.btn_cancel_y_pos = g_atoi(v); } else if (g_strncmp(n, "ls_btn_cancel_width", 64) == 0) { - globals->ls_btn_cancel_width = g_atoi(v); + globals->ls_unscaled.btn_cancel_width = g_atoi(v); } else if (g_strncmp(n, "ls_btn_cancel_height", 64) == 0) { - globals->ls_btn_cancel_height = g_atoi(v); + globals->ls_unscaled.btn_cancel_height = g_atoi(v); } } @@ -1347,29 +1387,95 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) LOG(LOG_LEVEL_DEBUG, "enable_token_login: %d", globals->enable_token_login); LOG(LOG_LEVEL_DEBUG, "ls_top_window_bg_color: %x", globals->ls_top_window_bg_color); - LOG(LOG_LEVEL_DEBUG, "ls_width: %d", globals->ls_width); - LOG(LOG_LEVEL_DEBUG, "ls_height: %d", globals->ls_height); + LOG(LOG_LEVEL_DEBUG, "ls_width (unscaled): %d", globals->ls_unscaled.width); + LOG(LOG_LEVEL_DEBUG, "ls_height (unscaled): %d", globals->ls_unscaled.height); LOG(LOG_LEVEL_DEBUG, "ls_bg_color: %x", globals->ls_bg_color); LOG(LOG_LEVEL_DEBUG, "ls_title: %s", globals->ls_title); LOG(LOG_LEVEL_DEBUG, "ls_logo_filename: %s", globals->ls_logo_filename); - LOG(LOG_LEVEL_DEBUG, "ls_logo_x_pos: %d", globals->ls_logo_x_pos); - LOG(LOG_LEVEL_DEBUG, "ls_logo_y_pos: %d", globals->ls_logo_y_pos); - LOG(LOG_LEVEL_DEBUG, "ls_label_x_pos: %d", globals->ls_label_x_pos); - LOG(LOG_LEVEL_DEBUG, "ls_label_width: %d", globals->ls_label_width); - LOG(LOG_LEVEL_DEBUG, "ls_input_x_pos: %d", globals->ls_input_x_pos); - LOG(LOG_LEVEL_DEBUG, "ls_input_width: %d", globals->ls_input_width); - LOG(LOG_LEVEL_DEBUG, "ls_input_y_pos: %d", globals->ls_input_y_pos); - LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_x_pos: %d", globals->ls_btn_ok_x_pos); - LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_y_pos: %d", globals->ls_btn_ok_y_pos); - LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_width: %d", globals->ls_btn_ok_width); - LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_height: %d", globals->ls_btn_ok_height); - LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_x_pos: %d", globals->ls_btn_cancel_x_pos); - LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_y_pos: %d", globals->ls_btn_cancel_y_pos); - LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_width: %d", globals->ls_btn_cancel_width); - LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_height: %d", globals->ls_btn_cancel_height); + LOG(LOG_LEVEL_DEBUG, "ls_logo_x_pos : %d", globals->ls_unscaled.logo_x_pos); + LOG(LOG_LEVEL_DEBUG, "ls_logo_y_pos : %d", globals->ls_unscaled.logo_y_pos); + LOG(LOG_LEVEL_DEBUG, "ls_label_x_pos : %d", globals->ls_unscaled.label_x_pos); + LOG(LOG_LEVEL_DEBUG, "ls_label_width : %d", globals->ls_unscaled.label_width); + LOG(LOG_LEVEL_DEBUG, "ls_input_x_pos : %d", globals->ls_unscaled.input_x_pos); + LOG(LOG_LEVEL_DEBUG, "ls_input_width : %d", globals->ls_unscaled.input_width); + LOG(LOG_LEVEL_DEBUG, "ls_input_y_pos : %d", globals->ls_unscaled.input_y_pos); + LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_x_pos : %d", globals->ls_unscaled.btn_ok_x_pos); + LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_y_pos : %d", globals->ls_unscaled.btn_ok_y_pos); + LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_width : %d", globals->ls_unscaled.btn_ok_width); + LOG(LOG_LEVEL_DEBUG, "ls_btn_ok_height : %d", globals->ls_unscaled.btn_ok_height); + LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_x_pos : %d", globals->ls_unscaled.btn_cancel_x_pos); + LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_y_pos : %d", globals->ls_unscaled.btn_cancel_y_pos); + LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_width : %d", globals->ls_unscaled.btn_cancel_width); + LOG(LOG_LEVEL_DEBUG, "ls_btn_cancel_height : %d", globals->ls_unscaled.btn_cancel_height); list_delete(names); list_delete(values); g_file_close(fd); return 0; } + +/** + * Scale the configuration values + * + * After a font has been loaded, we can produce scaled versions of the + * login screen layout parameters which will correspond to the size of the + * font + */ +void +xrdp_login_wnd_scale_config_values(struct xrdp_wm *self) +{ + const struct xrdp_ls_dimensions *unscaled = + &self->xrdp_config->cfg_globals.ls_unscaled; + struct xrdp_ls_dimensions *scaled = + &self->xrdp_config->cfg_globals.ls_scaled; + + /* Clear the scaled values, so if we add one and forget to scale it, + * it will be obvious */ + g_memset(scaled, '\0', sizeof(*scaled)); + + /* If we don't have a font, use zeros for everything */ + if (self->default_font == NULL) + { + LOG(LOG_LEVEL_ERROR, "Can't scale login values - no font available"); + } + else + { + const int fheight = self->default_font->body_height; + /* Define a Macro to scale to the nearest pixel value, + * rounding up as appropriate */ +#define SCALE_AND_ROUND(x) \ + (((x) * fheight + (DEFAULT_FONT_PIXEL_SIZE / 2)) / \ + DEFAULT_FONT_PIXEL_SIZE) + + LOG(LOG_LEVEL_DEBUG, "Login screen scale factor %f", + (float)fheight / DEFAULT_FONT_PIXEL_SIZE); + + scaled->width = SCALE_AND_ROUND(unscaled->width); + scaled->height = SCALE_AND_ROUND(unscaled->height); + scaled->logo_width = SCALE_AND_ROUND(unscaled->logo_width); + scaled->logo_height = SCALE_AND_ROUND(unscaled->logo_height); + scaled->logo_x_pos = SCALE_AND_ROUND(unscaled->logo_x_pos); + scaled->logo_y_pos = SCALE_AND_ROUND(unscaled->logo_y_pos); + scaled->label_x_pos = SCALE_AND_ROUND(unscaled->label_x_pos); + scaled->label_width = SCALE_AND_ROUND(unscaled->label_width); + scaled->input_x_pos = SCALE_AND_ROUND(unscaled->input_x_pos); + scaled->input_width = SCALE_AND_ROUND(unscaled->input_width); + scaled->input_y_pos = SCALE_AND_ROUND(unscaled->input_y_pos); + scaled->btn_ok_x_pos = SCALE_AND_ROUND(unscaled->btn_ok_x_pos); + scaled->btn_ok_y_pos = SCALE_AND_ROUND(unscaled->btn_ok_y_pos); + scaled->btn_ok_width = SCALE_AND_ROUND(unscaled->btn_ok_width); + scaled->btn_ok_height = SCALE_AND_ROUND(unscaled->btn_ok_height); + scaled->btn_cancel_x_pos = SCALE_AND_ROUND(unscaled->btn_cancel_x_pos); + scaled->btn_cancel_y_pos = SCALE_AND_ROUND(unscaled->btn_cancel_y_pos); + scaled->btn_cancel_width = SCALE_AND_ROUND(unscaled->btn_cancel_width); + scaled->btn_cancel_height = SCALE_AND_ROUND(unscaled->btn_cancel_height); + scaled->default_btn_height = fheight + DEFAULT_BUTTON_MARGIN_H; + scaled->log_wnd_width = SCALE_AND_ROUND(unscaled->log_wnd_width); + scaled->log_wnd_height = SCALE_AND_ROUND(unscaled->log_wnd_height); + scaled->edit_height = fheight + DEFAULT_EDIT_MARGIN_H; + scaled->combo_height = fheight + DEFAULT_COMBO_MARGIN_H; + scaled->help_wnd_width = SCALE_AND_ROUND(unscaled->help_wnd_width); + scaled->help_wnd_height = SCALE_AND_ROUND(unscaled->help_wnd_height); +#undef SCALE_AND_ROUND + } +} diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 2f907f03..12f75e0c 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -605,12 +605,12 @@ struct xrdp_bitmap #define NUM_FONTS 0x4e00 #define DEFAULT_FONT_NAME "sans-10.fv1" +#define DEFAULT_FONT_PIXEL_SIZE 16 -#define DEFAULT_ELEMENT_TOP 35 -#define DEFAULT_BUTTON_W 60 -#define DEFAULT_BUTTON_H 23 -#define DEFAULT_COMBO_H 21 -#define DEFAULT_EDIT_H 21 +#define DEFAULT_BUTTON_MARGIN_H 12 +#define DEFAULT_BUTTON_MARGIN_W 12 +#define DEFAULT_COMBO_MARGIN_H 6 +#define DEFAULT_EDIT_MARGIN_H 6 #define DEFAULT_WND_LOGIN_W 425 #define DEFAULT_WND_LOGIN_H 475 #define DEFAULT_WND_HELP_W 340 @@ -657,9 +657,39 @@ struct xrdp_startup_params }; /* - * For storing xrdp.ini configuration settings + * For storing xrdp.ini (and other) configuration settings */ +struct xrdp_ls_dimensions +{ + int width; /* window width */ + int height; /* window height */ + int logo_width; /* logo width (optional) */ + int logo_height; /* logo height (optional) */ + int logo_x_pos; /* logo x co-ordinate */ + int logo_y_pos; /* logo y co-ordinate */ + int label_x_pos; /* x pos of labels */ + int label_width; /* width of labels */ + int input_x_pos; /* x pos of text and combo boxes */ + int input_width; /* width of input and combo boxes */ + int input_y_pos; /* y pos for for first label and combo box */ + int btn_ok_x_pos; /* x pos for OK button */ + int btn_ok_y_pos; /* y pos for OK button */ + int btn_ok_width; /* width of OK button */ + int btn_ok_height; /* height of OK button */ + int btn_cancel_x_pos; /* x pos for Cancel button */ + int btn_cancel_y_pos; /* y pos for Cancel button */ + int btn_cancel_width; /* width of Cancel button */ + int btn_cancel_height; /* height of Cancel button */ + int default_btn_height; /* Default button height (e.g. OK on login box) */ + int log_wnd_width; /* Width of log window */ + int log_wnd_height; /* Height of log window */ + int edit_height; /* Height of an edit box */ + int combo_height; /* Height of a combo box */ + int help_wnd_width; /* Width of login help window */ + int help_wnd_height; /* Height of login help window */ +}; + struct xrdp_cfg_globals { int ini_version; /* xrdp.ini file version number */ @@ -697,33 +727,18 @@ struct xrdp_cfg_globals /* login screen */ int ls_top_window_bg_color; /* top level window background color */ - int ls_width; /* window width */ - int ls_height; /* window height */ int ls_bg_color; /* background color */ char ls_background_image[256]; /* background image file name */ - enum xrdp_bitmap_load_transform ls_background_transform; /* transform to apply to background image */ + enum xrdp_bitmap_load_transform ls_background_transform; char ls_logo_filename[256]; /* logo filename */ - enum xrdp_bitmap_load_transform ls_logo_transform; /* transform to apply to logo */ - int ls_logo_width; /* logo width (optional) */ - int ls_logo_height; /* logo height (optional) */ - int ls_logo_x_pos; /* logo x coordinate */ - int ls_logo_y_pos; /* logo y coordinate */ - int ls_label_x_pos; /* x pos of labels */ - int ls_label_width; /* width of labels */ - int ls_input_x_pos; /* x pos of text and combo boxes */ - int ls_input_width; /* width of input and combo boxes */ - int ls_input_y_pos; /* y pos for for first label and combo box */ - int ls_btn_ok_x_pos; /* x pos for OK button */ - int ls_btn_ok_y_pos; /* y pos for OK button */ - int ls_btn_ok_width; /* width of OK button */ - int ls_btn_ok_height; /* height of OK button */ - int ls_btn_cancel_x_pos; /* x pos for Cancel button */ - int ls_btn_cancel_y_pos; /* y pos for Cancel button */ - int ls_btn_cancel_width; /* width of Cancel button */ - int ls_btn_cancel_height; /* height of Cancel button */ + enum xrdp_bitmap_load_transform ls_logo_transform; char ls_title[256]; /* loginscreen window title */ + /* Login screen dimensions, unscaled (from config) */ + struct xrdp_ls_dimensions ls_unscaled; + /* Login screen dimensions, scaled (after font is loaded) */ + struct xrdp_ls_dimensions ls_scaled; }; struct xrdp_cfg_logging diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index ff37deb7..0076ef44 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -62,7 +62,6 @@ xrdp_wm_create(struct xrdp_process *owner, self->log = list_create(); self->log->auto_free = 1; self->mm = xrdp_mm_create(self); - self->default_font = xrdp_font_create(self); /* this will use built in keymap or load from file */ get_keymaps(self->session->client_info->keylayout, &(self->keymap)); xrdp_wm_set_login_state(self, WMLS_RESET); @@ -576,6 +575,12 @@ xrdp_wm_init(struct xrdp_wm *self) load_xrdp_config(self->xrdp_config, self->session->xrdp_ini, self->screen->bpp); + /* Load the font */ + self->default_font = xrdp_font_create(self); + + /* Scale the login screen values */ + xrdp_login_wnd_scale_config_values(self); + /* global channels allow */ names = list_create(); names->auto_free = 1; @@ -2047,12 +2052,14 @@ xrdp_wm_log_wnd_notify(struct xrdp_bitmap *wnd, if (painter != 0) { + unsigned int row_height = xrdp_painter_font_body_height(painter); painter->fg_color = wnd->wm->black; for (index = 0; index < wnd->wm->log->count; index++) { text = (char *)list_get_item(wnd->wm->log, index); - xrdp_painter_draw_text(painter, wnd, 10, 30 + index * 15, text); + xrdp_painter_draw_text(painter, wnd, 10, + (index + 2) * row_height, text); } } } @@ -2102,8 +2109,9 @@ xrdp_wm_show_log(struct xrdp_wm *self) if (self->log_wnd == 0) { - w = DEFAULT_WND_LOG_W; - h = DEFAULT_WND_LOG_H; + w = self->xrdp_config->cfg_globals.ls_scaled.log_wnd_width; + h = self->xrdp_config->cfg_globals.ls_scaled.log_wnd_height; + xoffset = 10; yoffset = 10; @@ -2147,12 +2155,19 @@ xrdp_wm_show_log(struct xrdp_wm *self) self->log_wnd->top = primary_y_offset + yoffset; set_string(&(self->log_wnd->caption1), "Connection Log"); /* ok button */ - but = xrdp_bitmap_create(DEFAULT_BUTTON_W, DEFAULT_BUTTON_H, self->screen->bpp, WND_TYPE_BUTTON, self); + const char *ok_string = "OK"; + const int ok_height = + self->xrdp_config->cfg_globals.ls_scaled.default_btn_height; + const int ok_width = xrdp_painter_text_width(self->painter, ok_string) + + DEFAULT_BUTTON_MARGIN_W; + + but = xrdp_bitmap_create(ok_width, ok_height, self->screen->bpp, + WND_TYPE_BUTTON, self); list_insert_item(self->log_wnd->child_list, 0, (long)but); but->parent = self->log_wnd; but->owner = self->log_wnd; - but->left = (w - DEFAULT_BUTTON_W) - xoffset; - but->top = (h - DEFAULT_BUTTON_H) - yoffset; + but->left = (w - ok_width) - xoffset; + but->top = (h - ok_height) - yoffset; but->id = 1; but->tab_stop = 1; set_string(&but->caption1, "OK"); From a417ab0542be1375a70aa8158b9ed990760a263a Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:42:53 +0100 Subject: [PATCH 8/9] Add font control variables to xrdp.ini This commit adds the variables fv1_select and default_dpi to xrdp.ini. These variables allow for a different font to be loaded, depending on the DPI of the login screen. --- docs/man/xrdp.ini.5.in | 16 ++++- xrdp/xrdp.h | 11 +++- xrdp/xrdp.ini.in | 23 +++++-- xrdp/xrdp_font.c | 138 ++++++++++++++++++++++++++++++++++++++--- xrdp/xrdp_login_wnd.c | 86 +++++++++++++++++++++++++ xrdp/xrdp_types.h | 3 + xrdp/xrdp_wm.c | 4 +- 7 files changed, 263 insertions(+), 18 deletions(-) diff --git a/docs/man/xrdp.ini.5.in b/docs/man/xrdp.ini.5.in index 581fcac9..b680dcba 100644 --- a/docs/man/xrdp.ini.5.in +++ b/docs/man/xrdp.ini.5.in @@ -125,12 +125,12 @@ separator as the password supplied by the user and treats it as autologon. If no defaults to \fBfalse\fP. .TP -\domain_user_separator\fP=\separator\fP +\fBdomain_user_separator\fP=\fBseparator\fP If specified the domain name supplied by the client is appended to the username separated by \fBseparator\fP. .TP -\enable_token_login\fP=\fI[true|false]\fP +\fBenable_token_login\fP=\fI[true|false]\fP If set to \fB1\fP, \fBtrue\fP or \fByes\fP, \fBxrdp\fP requires clients to include username and password initial connection phase. In other words, xrdp doesn't allow clients to show login screen if set to true. If not specified, defaults to \fBfalse\fP. @@ -212,6 +212,18 @@ These options override the colors used internally by \fBxrdp\fP(8) to draw the l Colors are defined using a hexadecimal (hex) notation for the combination of Red, Green, and Blue color values (RGB). The lowest value that can be given to one of the light sources is 0 (hex 00). The highest value is 255 (hex FF). +.TP +\fBfv1_select\fP=\fI130:sans-18.fv1,0:sans-10.fv1\fP +Selects a default fv1 font. +This parameter is a comma-separated list of DPI:name pairs. The list +is scanned from left-to-right. The font used is the first font whose DPI +value is less-than-or-equal to the vertical DPI of the monitor used for +the login screen. +.TP +\fBdefault_dpi\fP=\fI96\fP +Default DPI used for a monitor if the client does not send physical +size information. + .SH "LOGGING" The following parameters can be used in the \fB[Logging]\fR section: diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index a769f987..ae4bf062 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -343,7 +343,7 @@ xrdp_painter_line(struct xrdp_painter *self, /* xrdp_font.c */ struct xrdp_font * -xrdp_font_create(struct xrdp_wm *wm); +xrdp_font_create(struct xrdp_wm *wm, unsigned int dpi); void xrdp_font_delete(struct xrdp_font *self); int @@ -387,6 +387,14 @@ int get_keymaps(int keylayout, struct xrdp_keymap *keymap); /* xrdp_login_wnd.c */ +/** + * Gets the DPI of the login (primary) monitor + * + * @param self xrdp_wm instance + * @return DPI of primary monitor, or 0 if unavailable. + */ +unsigned int +xrdp_login_wnd_get_monitor_dpi(struct xrdp_wm *self); int xrdp_login_wnd_create(struct xrdp_wm *self); int @@ -394,7 +402,6 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp); void xrdp_login_wnd_scale_config_values(struct xrdp_wm *self); - /* xrdp_bitmap_compress.c */ int xrdp_bitmap_compress(char *in_data, int width, int height, diff --git a/xrdp/xrdp.ini.in b/xrdp/xrdp.ini.in index 3c60a5f2..48329f91 100644 --- a/xrdp/xrdp.ini.in +++ b/xrdp/xrdp.ini.in @@ -106,6 +106,17 @@ grey=dedede #green=00ff00 #background=626c72 +; +; Select a default fv1 font +; +; This parameter is a comma-separated list of DPI:name pairs. +; The list is scanned from left-to-right. The font used is the first +; font whose DPI value is less-than-or-equal to the vertical DPI of +; the monitor used for the login screen. +#fv1_select=130:sans-18.fv1,0:sans-10.fv1 +; Default DPI used for a monitor when that information is unknown +#default_dpi=96 + ; ; configure login screen ; @@ -118,6 +129,10 @@ ls_top_window_bg_color=009cb5 ; width and height of login screen ; +; When the sans-10.fv1 font is selected, these values are in pixels. +; For other fonts, these values (and other size values) will be scaled +; appropriately to preserve the proportions of the login screen. +; ; The default height allows for about 5 fields to be comfortably displayed ; above the buttons at the bottom. To display more fields, make ; larger, and also increase and @@ -147,15 +162,15 @@ ls_bg_color=dedede ; For transform values, see 'ls_background_transform'. The logo width and ; logo height are ignored for a transform of 'none'. ls_logo_filename= -#ls_logo_transform=none -#ls_logo_width=240 -#ls_logo_height=140 +ls_logo_transform=scale +ls_logo_width=240 +ls_logo_height=140 ls_logo_x_pos=55 ls_logo_y_pos=50 ; for positioning labels such as username, password etc ls_label_x_pos=30 -ls_label_width=65 +ls_label_width=68 ; for positioning text and combo boxes next to above labels ls_input_x_pos=110 diff --git a/xrdp/xrdp_font.c b/xrdp/xrdp_font.c index 5813b361..6fe81d8c 100644 --- a/xrdp/xrdp_font.c +++ b/xrdp/xrdp_font.c @@ -24,8 +24,11 @@ #include #endif +#include + #include "xrdp.h" #include "log.h" +#include "string_calls.h" #if 0 /* not used */ static char w_char[] = @@ -49,9 +52,93 @@ static char w_char[] = }; #endif +/*****************************************************************************/ +/** + * Parses the fv1_select configuration value to get the font to use, + * based on the DPI of the primary monitor + * + * @param globals Configuration globals + * @param dpi DPI of primary monitor. If not known, a suitable + * default should be passed in here. + * @param[out] font_name Name of font to use + * @param[in] font_name_len Length of font name buffer + */ +static void +get_font_name_from_dpi(const struct xrdp_cfg_globals *globals, + unsigned int dpi, + char *font_name, int font_name_len) +{ + int bad_selector = 0; + + font_name[0] = '\0'; + + const char *fv1_select = globals->fv1_select; + if (fv1_select == NULL || fv1_select[0] == '\0') + { + fv1_select = DEFAULT_FV1_SELECT; + } + + const char *p = fv1_select; + + while (p != NULL) + { + /* DPI value must be next in string */ + if (!isdigit(*p)) + { + bad_selector = 1; + break; + } + unsigned int field_dpi = g_atoi(p); + if (field_dpi <= dpi) + { + /* Use this font */ + p = g_strchr(p, ':'); + if (p == NULL) + { + bad_selector = 1; + } + else + { + ++p; + const char *q = g_strchr(p, ','); + if (q == NULL) + { + q = p + g_strlen(p); + } + if (q - p > (font_name_len - 1)) + { + q = p + font_name_len - 1; + } + g_memcpy(font_name, p, q - p); + font_name[q - p] = '\0'; + } + break; + } + else + { + p = g_strchr(p, ','); + if (p != NULL) + { + ++p; + } + } + } + + if (bad_selector) + { + LOG(LOG_LEVEL_WARNING, "Unable to parse fv1_select configuration"); + } + + if (font_name[0] == '\0') + { + LOG(LOG_LEVEL_WARNING, "Loading default font " DEFAULT_FONT_NAME); + g_snprintf(font_name, font_name_len, DEFAULT_FONT_NAME); + } +} + /*****************************************************************************/ struct xrdp_font * -xrdp_font_create(struct xrdp_wm *wm) +xrdp_font_create(struct xrdp_wm *wm, unsigned int dpi) { struct xrdp_font *self; struct stream *s; @@ -62,17 +149,52 @@ xrdp_font_create(struct xrdp_wm *wm) int datasize; int file_size; struct xrdp_font_char *f; + const char *file_path; + char file_path_buff[256]; int min_descender; - char file_path[256]; - + char font_name[256]; + const struct xrdp_cfg_globals *globals = &wm->xrdp_config->cfg_globals; LOG_DEVEL(LOG_LEVEL_TRACE, "in xrdp_font_create"); - g_snprintf(file_path, 255, "%s/%s", XRDP_SHARE_PATH, DEFAULT_FONT_NAME); + + if (dpi == 0) + { + LOG(LOG_LEVEL_WARNING, "No DPI value is available to find login font"); + dpi = globals->default_dpi; + LOG(LOG_LEVEL_WARNING, "Using the default_dpi of %u", dpi); + } + get_font_name_from_dpi(globals, dpi, font_name, sizeof(font_name)); + + if (font_name[0] == '/') + { + /* User specified absolute path */ + file_path = font_name; + } + else + { + g_snprintf(file_path_buff, sizeof(file_path_buff), + XRDP_SHARE_PATH "/%s", + font_name); + file_path = file_path_buff; + } if (!g_file_exist(file_path)) { - LOG(LOG_LEVEL_ERROR, "xrdp_font_create: error font file [%s] does not exist", - file_path); - return 0; + /* Try to fall back to the default */ + const char *default_file_path = XRDP_SHARE_PATH "/" DEFAULT_FONT_NAME; + if (g_file_exist(default_file_path)) + { + LOG(LOG_LEVEL_WARNING, + "xrdp_font_create: font file [%s] does not exist - using [%s]", + file_path, default_file_path); + file_path = default_file_path; + } + else + { + LOG(LOG_LEVEL_ERROR, + "xrdp_font_create: Can't load either [%s] or [%s]", + file_path, default_file_path); + return 0; + } } file_size = g_file_get_size(file_path); @@ -150,7 +272,6 @@ xrdp_font_create(struct xrdp_wm *wm) { LOG(LOG_LEVEL_ERROR, "error in xrdp_font_create"); } - index++; } @@ -161,7 +282,6 @@ xrdp_font_create(struct xrdp_wm *wm) self->body_height = -self->font_items[32].baseline + 1; } } - } free_stream(s); diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index d11287c5..5afd730c 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -668,6 +668,81 @@ xrdp_wm_login_fill_in_combo(struct xrdp_wm *self, struct xrdp_bitmap *b) return 0; } +/******************************************************************************/ +unsigned int +xrdp_login_wnd_get_monitor_dpi(struct xrdp_wm *self) +{ + unsigned int result = 0; + const struct display_size_description *display_sizes = + &self->client_info->display_sizes; + unsigned int height_pixels = 0; + unsigned int height_mm = 0; + + unsigned int i; + + /* Look at the monitor data first */ + for (i = 0; i < display_sizes->monitorCount; ++i) + { + const struct monitor_info *mi = &display_sizes->minfo_wm[i]; + { + if (mi->is_primary) + { + height_pixels = mi->bottom - mi->top + 1; + height_mm = mi->physical_height; + break; + } + } + } + + /* No primary monitor, or values not defined - use the desktop size */ + if (height_mm == 0) + { + height_pixels = display_sizes->session_height; + height_mm = self->client_info->session_physical_height; + + if (height_mm == 0) + { + LOG(LOG_LEVEL_WARNING, + "No information is available to determine login screen DPI"); + } + else if (height_pixels < 768) + { + /* A bug was encountered with mstsc.exe version + 10.0.19041.1682 where the full physical monitor size was + sent in TS_UD_CS_CORE when the desktop size was set to + less than the screen size. + To generate the bug, make a connection with a full-screen + single window, cancel the login, and reconnect at + (e.g.) 800x600. + We can't detect that exact situation here, but if the + session height is so small as to likely be in a window + (rather than full screen), we should ignore the physical + size */ + LOG(LOG_LEVEL_WARNING, + "Ignoring unlikely physical session size %u " + "for height of %u pixels", height_mm, height_pixels); + height_mm = 0; + } + } + + if (height_mm != 0) + { + /* + * DPI = height_pixels / (height_mm / 25.4) + * = (height_pixels * 25.4) / height_mm + * = (height_pixels * 127) / (height_mm * 5) + */ + result = (height_pixels * 127 ) / (height_mm * 5); + LOG(LOG_LEVEL_INFO, + "Login screen monitor height is %u pixels over %u mm (%u DPI)", + height_pixels, + height_mm, + result); + } + return result; +} + + /******************************************************************************/ int xrdp_login_wnd_create(struct xrdp_wm *self) @@ -989,6 +1064,7 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) /* set default values in case we can't get them from xrdp.ini file */ globals->ini_version = 1; + globals->default_dpi = 96; globals->ls_top_window_bg_color = HCOLOR(bpp, xrdp_wm_htoi("009cb5")); globals->ls_bg_color = HCOLOR(bpp, xrdp_wm_htoi("dedede")); @@ -1217,6 +1293,16 @@ load_xrdp_config(struct xrdp_config *config, const char *xrdp_ini, int bpp) } /* login screen values */ + else if (g_strcmp(n, "default_dpi") == 0) + { + globals->default_dpi = g_atoi(v); + } + + else if (g_strcmp(n, "fv1_select") == 0) + { + g_strncpy(globals->fv1_select, v, sizeof(globals->fv1_select) - 1); + } + else if (g_strncmp(n, "ls_top_window_bg_color", 64) == 0) { globals->ls_top_window_bg_color = HCOLOR(bpp, xrdp_wm_htoi(v)); diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 12f75e0c..98b7b08c 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -606,6 +606,7 @@ struct xrdp_bitmap #define NUM_FONTS 0x4e00 #define DEFAULT_FONT_NAME "sans-10.fv1" #define DEFAULT_FONT_PIXEL_SIZE 16 +#define DEFAULT_FV1_SELECT "130:sans-18.fv1,0:" DEFAULT_FONT_NAME #define DEFAULT_BUTTON_MARGIN_H 12 #define DEFAULT_BUTTON_MARGIN_W 12 @@ -726,6 +727,8 @@ struct xrdp_cfg_globals int background; /* login screen */ + unsigned int default_dpi; /* Default DPI to use if nothing from client */ + char fv1_select[256]; /* Selection string for fv1 font */ int ls_top_window_bg_color; /* top level window background color */ int ls_bg_color; /* background color */ char ls_background_image[256]; /* background image file name */ diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index 0076ef44..61261a97 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -569,6 +569,7 @@ xrdp_wm_init(struct xrdp_wm *self) char default_section_name[256]; char section_name[256]; char autorun_name[256]; + int dpi; LOG(LOG_LEVEL_DEBUG, "in xrdp_wm_init: "); @@ -576,7 +577,8 @@ xrdp_wm_init(struct xrdp_wm *self) self->screen->bpp); /* Load the font */ - self->default_font = xrdp_font_create(self); + dpi = xrdp_login_wnd_get_monitor_dpi(self); + self->default_font = xrdp_font_create(self, dpi); /* Scale the login screen values */ xrdp_login_wnd_scale_config_values(self); From e44879740f39d66e3bc65eb1f9baaec261e149b7 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:46:54 +0100 Subject: [PATCH 9/9] Update fonts Replace sans-10.fv1 with a modern version generated with the new tools. Also add a sans-18.fv1 for higher DPI monitors. --- xrdp/Makefile.am | 1 + xrdp/sans-10.fv1 | Bin 658956 -> 566436 bytes xrdp/sans-18.fv1 | Bin 0 -> 1165136 bytes 3 files changed, 1 insertion(+) create mode 100644 xrdp/sans-18.fv1 diff --git a/xrdp/Makefile.am b/xrdp/Makefile.am index 8441e1da..dd2d7fa8 100644 --- a/xrdp/Makefile.am +++ b/xrdp/Makefile.am @@ -99,5 +99,6 @@ dist_xrdppkgdata_DATA = \ xrdp256.bmp \ xrdp_logo.bmp \ sans-10.fv1 \ + sans-18.fv1 \ cursor0.cur \ cursor1.cur diff --git a/xrdp/sans-10.fv1 b/xrdp/sans-10.fv1 index 047870fa254e5f5832003a2bd2cccc8a9b4e6fbe..5085632003001cf7c7c742d522e26c069acdcdb7 100644 GIT binary patch literal 566436 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 z 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 literal 658956 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 Gz3c~F8GqUU literal 0 HcmV?d00001