1diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c
2--- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c
3+++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c
4@@ -1426,16 +1426,104 @@ _cairo_win32_printing_surface_fill (void
5     }
6
7     fflush(stderr);
8
9     return status;
10 }
11
12 static cairo_int_status_t
13+_cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t 	*surface,
14+						 cairo_operator_t	 op,
15+						 const cairo_pattern_t  *source,
16+						 cairo_glyph_t        	*glyphs,
17+						 int			 num_glyphs,
18+						 cairo_scaled_font_t  	*scaled_font,
19+						 cairo_clip_t		*clip,
20+						 int			*remaining_glyphs)
21+{
22+    cairo_matrix_t ctm;
23+    cairo_glyph_t  *unicode_glyphs;
24+    cairo_scaled_font_subsets_glyph_t subset_glyph;
25+    int i, first;
26+    cairo_bool_t sequence_is_unicode;
27+    cairo_status_t status = CAIRO_STATUS_SUCCESS;
28+
29+    /* Where possible reverse the glyph indices back to unicode
30+     * characters. Strings of glyphs that could not be reversed to
31+     * unicode will be printed with ETO_GLYPH_INDEX.
32+     *
33+     * As _cairo_win32_scaled_font_index_to_ucs4() is a slow
34+     * operation, the font subsetting function
35+     * _cairo_scaled_font_subsets_map_glyph() is used to obtain
36+     * the unicode value because it caches the reverse mapping in
37+     * the subsets.
38+     */
39+
40+    if (surface->has_ctm) {
41+	for (i = 0; i < num_glyphs; i++)
42+	    cairo_matrix_transform_point (&surface->ctm, &glyphs[i].x, &glyphs[i].y);
43+	cairo_matrix_multiply (&ctm, &scaled_font->ctm, &surface->ctm);
44+	scaled_font = cairo_scaled_font_create (scaled_font->font_face,
45+						&scaled_font->font_matrix,
46+						&ctm,
47+						&scaled_font->options);
48+    }
49+
50+    unicode_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t));
51+    if (unicode_glyphs == NULL)
52+	return _cairo_error (CAIRO_STATUS_NO_MEMORY);
53+
54+    memcpy (unicode_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t));
55+    for (i = 0; i < num_glyphs; i++) {
56+	status = _cairo_scaled_font_subsets_map_glyph (surface->font_subsets,
57+						       scaled_font,
58+						       glyphs[i].index,
59+						       NULL, 0,
60+						       &subset_glyph);
61+	if (status)
62+	    goto fail;
63+
64+	unicode_glyphs[i].index = subset_glyph.unicode;
65+    }
66+
67+    i = 0;
68+    first = 0;
69+    sequence_is_unicode = unicode_glyphs[0].index <= 0xffff;
70+    while (i < num_glyphs) {
71+	if (i == num_glyphs - 1 ||
72+	    ((unicode_glyphs[i + 1].index < 0xffff) != sequence_is_unicode))
73+	{
74+	    status = _cairo_win32_surface_show_glyphs_internal (
75+		surface,
76+		op,
77+		source,
78+		sequence_is_unicode ? &unicode_glyphs[first] : &glyphs[first],
79+		i - first + 1,
80+		scaled_font,
81+		clip,
82+		remaining_glyphs,
83+		! sequence_is_unicode);
84+	    first = i + 1;
85+	    if (i < num_glyphs - 1)
86+		sequence_is_unicode = unicode_glyphs[i + 1].index <= 0xffff;
87+	}
88+	i++;
89+    }
90+
91+fail:
92+    if (surface->has_ctm)
93+	cairo_scaled_font_destroy (scaled_font);
94+
95+    free (unicode_glyphs);
96+
97+    return status;
98+}
99+
100+static cairo_int_status_t
101 _cairo_win32_printing_surface_show_glyphs (void                 *abstract_surface,
102                                            cairo_operator_t	 op,
103                                            const cairo_pattern_t *source,
104                                            cairo_glyph_t        *glyphs,
105                                            int			 num_glyphs,
106                                            cairo_scaled_font_t  *scaled_font,
107 					   cairo_clip_t		*clip,
108 					   int			*remaining_glyphs)
109@@ -1533,77 +1621,24 @@ _cairo_win32_printing_surface_show_glyph
110         }
111     }
112 #endif
113
114 #if CAIRO_HAS_WIN32_FONT
115     if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32 &&
116 	source->type == CAIRO_PATTERN_TYPE_SOLID)
117     {
118-	cairo_matrix_t ctm;
119-	cairo_glyph_t  *type1_glyphs = NULL;
120-	cairo_scaled_font_subsets_glyph_t subset_glyph;
121-
122-	/* Calling ExtTextOutW() with ETO_GLYPH_INDEX and a Type 1
123-	 * font on a printer DC prints garbled text. The text displays
124-	 * correctly on a display DC. When using a printer
125-	 * DC, ExtTextOutW() only works with characters and not glyph
126-	 * indices.
127-	 *
128-	 * For Type 1 fonts the glyph indices are converted back to
129-	 * unicode characters before calling _cairo_win32_surface_show_glyphs().
130-	 *
131-	 * As _cairo_win32_scaled_font_index_to_ucs4() is a slow
132-	 * operation, the font subsetting function
133-	 * _cairo_scaled_font_subsets_map_glyph() is used to obtain
134-	 * the unicode value because it caches the reverse mapping in
135-	 * the subsets.
136-	 */
137-	if (_cairo_win32_scaled_font_is_type1 (scaled_font)) {
138-	    type1_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t));
139-	    if (type1_glyphs == NULL) {
140-		status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
141-		goto FINISH;
142-	    }
143-	    memcpy (type1_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t));
144-	    for (i = 0; i < num_glyphs; i++) {
145-		status = _cairo_scaled_font_subsets_map_glyph (surface->font_subsets,
146-							       scaled_font,
147-							       type1_glyphs[i].index,
148-							       NULL, 0,
149-							       &subset_glyph);
150-		if (status)
151-		    goto FINISH;
152-
153-		type1_glyphs[i].index = subset_glyph.unicode;
154-	    }
155-	    glyphs = type1_glyphs;
156-	}
157-
158-	if (surface->has_ctm || surface->has_gdi_ctm) {
159-	    cairo_matrix_multiply (&ctm, &surface->ctm, &surface->gdi_ctm);
160-	    for (i = 0; i < num_glyphs; i++)
161-		cairo_matrix_transform_point (&ctm, &glyphs[i].x, &glyphs[i].y);
162-	    cairo_matrix_multiply (&ctm, &scaled_font->ctm, &ctm);
163-	    scaled_font = cairo_scaled_font_create (scaled_font->font_face,
164-						    &scaled_font->font_matrix,
165-						    &ctm,
166-						    &scaled_font->options);
167-	}
168-	status = _cairo_win32_surface_show_glyphs (surface, op,
169-						   source, glyphs,
170-						   num_glyphs, scaled_font,
171-						   clip,
172-						   remaining_glyphs);
173-	if (surface->has_ctm || surface->has_gdi_ctm)
174-	    cairo_scaled_font_destroy (scaled_font);
175-
176-	if (type1_glyphs != NULL)
177-	    free (type1_glyphs);
178-
179+	status = _cairo_win32_printing_surface_emit_win32_glyphs (surface,
180+								  op,
181+								  source,
182+								  glyphs,
183+								  num_glyphs,
184+								  scaled_font,
185+								  clip,
186+								  remaining_glyphs);
187 	goto FINISH;
188     }
189 #endif
190
191     SaveDC (surface->dc);
192     old_ctm = surface->ctm;
193     old_has_ctm = surface->has_ctm;
194     surface->has_ctm = TRUE;
195diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h
196--- a/gfx/cairo/cairo/src/cairo-win32-private.h
197+++ b/gfx/cairo/cairo/src/cairo-win32-private.h
198@@ -157,16 +157,27 @@ _cairo_win32_surface_get_extents (void
199 uint32_t
200 _cairo_win32_flags_for_dc (HDC dc);
201
202 cairo_status_t
203 _cairo_win32_surface_set_clip_region (void           *abstract_surface,
204 				      cairo_region_t *region);
205
206 cairo_int_status_t
207+_cairo_win32_surface_show_glyphs_internal (void			 *surface,
208+					   cairo_operator_t	  op,
209+					   const cairo_pattern_t *source,
210+					   cairo_glyph_t	 *glyphs,
211+					   int			  num_glyphs,
212+					   cairo_scaled_font_t	 *scaled_font,
213+					   cairo_clip_t		 *clip,
214+					   int			 *remaining_glyphs,
215+					   cairo_bool_t		  glyph_indices);
216+
217+cairo_int_status_t
218 _cairo_win32_surface_show_glyphs (void			*surface,
219 				  cairo_operator_t	 op,
220 				  const cairo_pattern_t	*source,
221 				  cairo_glyph_t		*glyphs,
222 				  int			 num_glyphs,
223 				  cairo_scaled_font_t	*scaled_font,
224 				  cairo_clip_t		*clip,
225 				  int			*remaining_glyphs);
226diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c
227--- a/gfx/cairo/cairo/src/cairo-win32-surface.c
228+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c
229@@ -1607,24 +1607,25 @@ static cairo_status_t
230 _cairo_win32_surface_flush (void *abstract_surface)
231 {
232     return _cairo_win32_surface_set_clip_region (abstract_surface, NULL);
233 }
234
235 #define STACK_GLYPH_SIZE 256
236
237 cairo_int_status_t
238-_cairo_win32_surface_show_glyphs (void			*surface,
239-				  cairo_operator_t	 op,
240-				  const cairo_pattern_t	*source,
241-				  cairo_glyph_t		*glyphs,
242-				  int			 num_glyphs,
243-				  cairo_scaled_font_t	*scaled_font,
244-				  cairo_clip_t		*clip,
245-				  int			*remaining_glyphs)
246+_cairo_win32_surface_show_glyphs_internal (void			*surface,
247+					   cairo_operator_t	 op,
248+					   const cairo_pattern_t	*source,
249+					   cairo_glyph_t		*glyphs,
250+					   int			 num_glyphs,
251+					   cairo_scaled_font_t	*scaled_font,
252+					   cairo_clip_t		*clip,
253+					   int			*remaining_glyphs,
254+					   cairo_bool_t           glyph_indexing)
255 {
256 #ifdef CAIRO_HAS_WIN32_FONT
257     if (scaled_font->backend->type == CAIRO_FONT_TYPE_DWRITE) {
258 #ifdef CAIRO_HAS_DWRITE_FONT
259         return _cairo_dwrite_show_glyphs_on_surface(surface, op, source, glyphs, num_glyphs, scaled_font, clip);
260 #endif
261     } else {
262 	cairo_win32_surface_t *dst = surface;
263@@ -1737,29 +1738,20 @@ _cairo_win32_surface_show_glyphs (void
264 		dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y);
265 		    /* note that GDI coordinate system is inverted */
266
267 		logical_x = next_logical_x;
268 		logical_y = next_logical_y;
269 	    }
270 	}
271
272-	/* Using glyph indices for a Type 1 font does not work on a
273-	 * printer DC. The win32 printing surface will convert the the
274-	 * glyph indices of Type 1 fonts to the unicode values.
275-	 */
276-	if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) &&
277-	    _cairo_win32_scaled_font_is_type1 (scaled_font))
278-	{
279+	if (glyph_indexing)
280+	    glyph_index_option = ETO_GLYPH_INDEX;
281+	else
282 	    glyph_index_option = 0;
283-	}
284-	else
285-	{
286-	    glyph_index_option = ETO_GLYPH_INDEX;
287-	}
288
289 	win_result = ExtTextOutW(dst->dc,
290 				 start_x,
291 				 start_y,
292 				 glyph_index_option | ETO_PDY,
293 				 NULL,
294 				 glyph_buf,
295 				 num_glyphs,
296@@ -1778,16 +1770,37 @@ _cairo_win32_surface_show_glyphs (void
297     }
298 #else
299     return CAIRO_INT_STATUS_UNSUPPORTED;
300 #endif
301 }
302
303 #undef STACK_GLYPH_SIZE
304
305+cairo_int_status_t
306+_cairo_win32_surface_show_glyphs (void			*surface,
307+ 				  cairo_operator_t	 op,
308+ 				  const cairo_pattern_t *source,
309+ 				  cairo_glyph_t	 	*glyphs,
310+ 				  int			 num_glyphs,
311+ 				  cairo_scaled_font_t	*scaled_font,
312+ 				  cairo_clip_t          *clip,
313+ 				  int		      	*remaining_glyphs)
314+{
315+    return _cairo_win32_surface_show_glyphs_internal (surface,
316+ 						      op,
317+ 						      source,
318+ 						      glyphs,
319+ 						      num_glyphs,
320+ 						      scaled_font,
321+ 						      clip,
322+ 						      remaining_glyphs,
323+ 						      TRUE);
324+}
325+
326 static cairo_surface_t *
327 cairo_win32_surface_create_internal (HDC hdc, cairo_format_t format)
328 {
329     cairo_win32_surface_t *surface;
330
331     RECT rect;
332
333     surface = malloc (sizeof (cairo_win32_surface_t));
334