static cairo_int_status_t _cairo_type3_glyph_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, int *remaining_glyphs) { cairo_type3_glyph_surface_t *surface = abstract_surface; cairo_int_status_t status; cairo_scaled_font_t *font; cairo_matrix_t new_ctm, ctm_inverse; int i; for (i = 0; i < num_glyphs; i++) cairo_matrix_transform_point (&surface->cairo_to_pdf, &glyphs[i].x, &glyphs[i].y); /* We require the matrix to be invertable. */ ctm_inverse = scaled_font->ctm; status = cairo_matrix_invert (&ctm_inverse); if (status) return CAIRO_INT_STATUS_IMAGE_FALLBACK; cairo_matrix_multiply (&new_ctm, &scaled_font->ctm, &ctm_inverse); font = cairo_scaled_font_create (scaled_font->font_face, &scaled_font->font_matrix, &new_ctm, &scaled_font->options); status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, NULL, 0, glyphs, num_glyphs, NULL, 0, FALSE, font); cairo_scaled_font_destroy (font); return status; }
static cairo_int_status_t _cairo_type3_glyph_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, cairo_clip_t *clip, int *remaining_glyphs) { cairo_type3_glyph_surface_t *surface = abstract_surface; cairo_int_status_t status; cairo_scaled_font_t *font; cairo_matrix_t new_ctm, invert_y_axis; status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); if (unlikely (status)) return status; cairo_matrix_init_scale (&invert_y_axis, 1, -1); cairo_matrix_multiply (&new_ctm, &invert_y_axis, &scaled_font->ctm); cairo_matrix_multiply (&new_ctm, &surface->cairo_to_pdf, &new_ctm); font = cairo_scaled_font_create (scaled_font->font_face, &scaled_font->font_matrix, &new_ctm, &scaled_font->options); if (unlikely (font->status)) return font->status; status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, NULL, 0, glyphs, num_glyphs, NULL, 0, FALSE, font); cairo_scaled_font_destroy (font); return status; }