diff --git a/src/vtedraw.cc b/src/vtedraw.cc
index a47efae..a697f49 100644
--- a/src/vtedraw.cc
+++ b/src/vtedraw.cc
@@ -1307,14 +1307,34 @@ _vte_draw_terminal_draw_graphic(struct _vte_draw *draw, vteunistr c, vte::color:
         case 0x2591: /* light shade */
         case 0x2592: /* medium shade */
         case 0x2593: /* dark shade */
-                cairo_set_source_rgba (cr,
-                                       fg->red / 65535.,
-                                       fg->green / 65535.,
-                                       fg->blue / 65535.,
-                                       (c - 0x2590) / 4.);
-                cairo_rectangle(cr, x, y, width, row_height);
-                cairo_fill (cr);
+        {
+                int dotsize = MAX(column_width / 8, 1);
+                int xstart, ystart, xend, yend, xi, yi;
+                for (ystart = yi = 0; ystart < row_height; ystart += dotsize, yi++) {
+                        yend = MIN(ystart + dotsize, row_height);
+                        for (xstart = xi = 0; xstart < column_width; xstart += dotsize, xi++) {
+                                gboolean paint;
+                                xend = MIN(xstart + dotsize, column_width);
+                                if (c == 0x2592) {
+                                        paint = !((xi ^ yi) & 1);
+                                } else {
+                                        paint = (xi % 2 == 0) && !(((xi >> 1) ^ (yi)) & 1);
+                                        if (c == 0x2593) {
+                                                paint = !paint;
+                                        }
+                                }
+                                if (paint) {
+                                        cairo_rectangle(cr,
+                                                        x + xstart,
+                                                        y + ystart,
+                                                        xend - xstart,
+                                                        yend - ystart);
+                                        cairo_fill(cr);
+                                }
+                        }
+                }
                 break;
+        }
 
         case 0x2594: /* upper one eighth block */
         {
