Index: uspace/lib/gfxfont/private/glyph_bmp.h
===================================================================
--- uspace/lib/gfxfont/private/glyph_bmp.h	(revision efca2e48da9fdf40325200492096839a3eab0673)
+++ uspace/lib/gfxfont/private/glyph_bmp.h	(revision dd65f4f775ec6d7b7e31bc45c83b102ca1c5e613)
@@ -39,4 +39,5 @@
 
 #include <gfx/coord.h>
+#include <types/gfx/glyph_bmp.h>
 
 /** Glyph bitmap
@@ -57,4 +58,6 @@
 };
 
+extern void gfx_glyph_bmp_find_used_rect(gfx_glyph_bmp_t *, gfx_rect_t *);
+
 #endif
 
Index: uspace/lib/gfxfont/src/glyph_bmp.c
===================================================================
--- uspace/lib/gfxfont/src/glyph_bmp.c	(revision efca2e48da9fdf40325200492096839a3eab0673)
+++ uspace/lib/gfxfont/src/glyph_bmp.c	(revision dd65f4f775ec6d7b7e31bc45c83b102ca1c5e613)
@@ -116,8 +116,12 @@
 	gfx_font_t *font = glyph->font;
 	gfx_coord_t x, y;
+	gfx_rect_t used_rect;
 	pixel_t pixel;
 	pixelmap_t pmap;
 	gfx_bitmap_alloc_t alloc;
 	errno_t rc;
+
+	/* Find actual rectangle being used */
+	gfx_glyph_bmp_find_used_rect(bmp, &used_rect);
 
 	/*
@@ -126,5 +130,5 @@
 	 * is adjusted.
 	 */
-	rc = gfx_font_splice_at_glyph(font, glyph, &bmp->rect);
+	rc = gfx_font_splice_at_glyph(font, glyph, &used_rect);
 	if (rc != EOK)
 		return rc;
@@ -142,6 +146,6 @@
 	/* Copy pixels to font bitmap */
 
-	for (y = bmp->rect.p0.y; y < bmp->rect.p1.y; y++) {
-		for (x = bmp->rect.p0.x; x < bmp->rect.p1.x; x++) {
+	for (y = used_rect.p0.y; y < used_rect.p1.y; y++) {
+		for (x = used_rect.p0.x; x < used_rect.p1.x; x++) {
 			pixel = bmp->pixels[(y - bmp->rect.p0.y) *
 			    (bmp->rect.p1.x - bmp->rect.p0.x) +
@@ -176,4 +180,53 @@
 }
 
+/** Find minimum rectangle covering all non-background pixels.
+ *
+ * @param bmp Glyph bitmap
+ * @param rect Place to store rectangle
+ */
+void gfx_glyph_bmp_find_used_rect(gfx_glyph_bmp_t *bmp, gfx_rect_t *rect)
+{
+	gfx_coord_t x, y;
+	gfx_coord2_t min;
+	gfx_coord2_t max;
+	bool anypix;
+	int pix;
+
+	min.x = bmp->rect.p1.x;
+	min.y = bmp->rect.p1.y;
+	max.x = bmp->rect.p0.x;
+	max.y = bmp->rect.p0.y;
+
+	anypix = false;
+	for (y = bmp->rect.p0.y; y < bmp->rect.p1.y; y++) {
+		for (x = bmp->rect.p0.x; x < bmp->rect.p1.x; x++) {
+			pix = gfx_glyph_bmp_getpix(bmp, x, y);
+			if (pix != 0) {
+				anypix = true;
+				if (x < min.x)
+					min.x = x;
+				if (y < min.y)
+					min.y = y;
+				if (x > max.x)
+					max.x = x;
+				if (y > max.y)
+					max.y = y;
+			}
+		}
+	}
+
+	if (anypix) {
+		rect->p0.x = min.x;
+		rect->p0.y = min.y;
+		rect->p1.x = max.x + 1;
+		rect->p1.y = max.y + 1;
+	} else {
+		rect->p0.x = 0;
+		rect->p0.y = 0;
+		rect->p1.x = 0;
+		rect->p1.y = 0;
+	}
+}
+
 /** Get pixel from glyph bitmap.
  *
Index: uspace/lib/gfxfont/test/glyph_bmp.c
===================================================================
--- uspace/lib/gfxfont/test/glyph_bmp.c	(revision efca2e48da9fdf40325200492096839a3eab0673)
+++ uspace/lib/gfxfont/test/glyph_bmp.c	(revision dd65f4f775ec6d7b7e31bc45c83b102ca1c5e613)
@@ -33,4 +33,5 @@
 #include <gfx/typeface.h>
 #include <pcut/pcut.h>
+#include "../private/glyph_bmp.h"
 
 PCUT_INIT;
@@ -477,4 +478,98 @@
 	pix = gfx_glyph_bmp_getpix(bmp, 1, 1);
 	PCUT_ASSERT_INT_EQUALS(0, pix);
+
+	gfx_glyph_bmp_close(bmp);
+
+	gfx_glyph_destroy(glyph);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** Test glyph_bmp_find_used_rect() find minimum used rectangle */
+PCUT_TEST(find_used_rect)
+{
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_glyph_metrics_t gmetrics;
+	gfx_glyph_t *glyph;
+	gfx_context_t *gc;
+	gfx_glyph_bmp_t *bmp;
+	gfx_rect_t rect;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_glyph_metrics_init(&gmetrics);
+	gmetrics.advance = 1;
+
+	rc = gfx_glyph_create(font, &gmetrics, &glyph);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	bmp = NULL;
+
+	rc = gfx_glyph_bmp_open(glyph, &bmp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(bmp);
+
+	/* Check used rectangle */
+
+	gfx_glyph_bmp_find_used_rect(bmp, &rect);
+	PCUT_ASSERT_INT_EQUALS(0, rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(0, rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(0, rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(0, rect.p1.y);
+
+	/* Set some pixels */
+
+	rc = gfx_glyph_bmp_setpix(bmp, -4, -5, 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_bmp_setpix(bmp, -2, -1, 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_bmp_setpix(bmp, 3, 4, 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_bmp_setpix(bmp, 7, 6, 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Check used rectangle */
+
+	gfx_glyph_bmp_find_used_rect(bmp, &rect);
+	PCUT_ASSERT_INT_EQUALS(-4, rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(-5, rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(8, rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(7, rect.p1.y);
+
+	/* Clear the corner pixels */
+
+	rc = gfx_glyph_bmp_setpix(bmp, -4, -5, 0);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_bmp_setpix(bmp, 7, 6, 0);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Check used rectangle got smaller */
+
+	gfx_glyph_bmp_find_used_rect(bmp, &rect);
+	PCUT_ASSERT_INT_EQUALS(-2, rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(-1, rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(4, rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(5, rect.p1.y);
 
 	gfx_glyph_bmp_close(bmp);
