static void draw_text (cairo_t *cr) { cairo_matrix_t tm; /* skew */ cairo_matrix_init (&tm, 1, 0, -0.25, 1, 0, 0); cairo_matrix_scale (&tm, FONT_SIZE, FONT_SIZE); cairo_set_font_matrix (cr, &tm); cairo_new_path (cr); cairo_move_to (cr, 50, SIZE-PAD); cairo_show_text (cr, "A"); /* rotate and scale */ cairo_matrix_init_rotate (&tm, M_PI / 2); cairo_matrix_scale (&tm, FONT_SIZE, FONT_SIZE * 2.0); cairo_set_font_matrix (cr, &tm); cairo_new_path (cr); cairo_move_to (cr, PAD, PAD + 25); cairo_show_text (cr, "A"); cairo_matrix_init_rotate (&tm, M_PI / 2); cairo_matrix_scale (&tm, FONT_SIZE * 2.0, FONT_SIZE); cairo_set_font_matrix (cr, &tm); cairo_new_path (cr); cairo_move_to (cr, PAD, PAD + 50); cairo_show_text (cr, "A"); }
CAMLprim value ml_cairo_set_font_matrix (value v_cr, value v_matrix) { #ifndef ARCH_ALIGN_DOUBLE cairo_set_font_matrix (cairo_t_val (v_cr), cairo_matrix_t_val (v_matrix)); #else cairo_matrix_t mat; ml_convert_cairo_matrix_in (v_matrix, &mat); cairo_set_font_matrix (cairo_t_val (v_cr), &mat); #endif check_cairo_status (v_cr); return Val_unit; }
static VALUE cr_set_font_matrix (VALUE self, VALUE matrix) { cairo_set_font_matrix (_SELF, RVAL2CRMATRIX (matrix)); cr_check_status (_SELF); return self; }
static int cr_set_font_matrix (lua_State *L) { cairo_t **obj = luaL_checkudata(L, 1, OOCAIRO_MT_NAME_CONTEXT); cairo_matrix_t mat; from_lua_matrix(L, &mat, 2); cairo_set_font_matrix(*obj, &mat); return 0; }
static PyObject * pycairo_set_font_matrix (PycairoContext *o, PyObject *args) { PycairoMatrix *matrix; if (!PyArg_ParseTuple (args, "O!:Context.set_font_matrix", &PycairoMatrix_Type, &matrix)) return NULL; cairo_set_font_matrix (o->ctx, &matrix->matrix); RETURN_NULL_IF_CAIRO_CONTEXT_ERROR(o->ctx); Py_RETURN_NONE; }
static gboolean pango_cairo_win32_font_install (PangoCairoFont *font, cairo_t *cr) { PangoCairoWin32Font *cwfont = PANGO_CAIRO_WIN32_FONT (font); cairo_set_font_face (cr, pango_cairo_win32_font_get_font_face (font)); cairo_set_font_matrix (cr, &cwfont->font_matrix); cairo_set_font_options (cr, cwfont->options); return TRUE; }
void VectorGraphics::apply_font_size(double pxsize) { cairo_matrix_t matrix; double s = viewport().map_height(pxsize)/meters; // This font matrix flips the font vertically. Necessary because of the origin // being at the lower left instead of the upper left as Cairo expects. // Horizontal flipping may also sometimes be necessary. if(viewport().shape().max_corner().y() < viewport().shape().min_corner().y()) { cairo_matrix_init(&matrix, s, 0, 0, s, 0, 0); } else { cairo_matrix_init(&matrix, s, 0, 0, -s, 0, 0); } cairo_set_font_matrix(cr(), &matrix); }
static PyObject * pycairo_set_font_matrix (PycairoContext *o, PyObject *args) { PycairoMatrix *matrix; if (!PyArg_ParseTuple (args, "O!:Context.set_font_matrix", &PycairoMatrix_Type, &matrix)) return NULL; cairo_set_font_matrix (o->ctx, &matrix->matrix); if (Pycairo_Check_Status (cairo_status (o->ctx))) return NULL; Py_RETURN_NONE; }
static int m_display_draw_text(lua_State * L) { struct ldisplay_t * display = luaL_checkudata(L, 1, MT_DISPLAY); cairo_scaled_font_t * sfont = luaL_checkudata_scaled_font(L, 2, MT_FONT); const char * text = luaL_optstring(L, 3, NULL); struct lpattern_t * pattern = luaL_checkudata(L, 4, MT_PATTERN); cairo_matrix_t * matrix = luaL_checkudata(L, 5, MT_MATRIX); cairo_t * cr = display->cr[display->index]; cairo_save(cr); cairo_set_scaled_font(cr, sfont); cairo_set_font_matrix(cr, matrix); cairo_text_path(cr, text); cairo_set_source(cr, pattern->pattern); cairo_fill(cr); cairo_restore(cr); return 0; }
GpStatus cairo_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) { cairo_matrix_t SavedMatrix; GpStringFormat *fmt; GpStringDetailStruct *StringDetails; WCHAR *CleanString; GpDrawTextData data; /* avoid recomputation of stuff done while measuring */ int StringLen = length; GpStatus status = AllocStringData (&CleanString, &StringDetails, length); if (status != Ok) return status; /* a NULL format is valid, it means get the generic default values (and free them later) */ if (!format) { GdipStringFormatGetGenericDefault ((GpStringFormat **)&fmt); } else { fmt = (GpStringFormat *)format; } /* is the following ok ? */ cairo_get_font_matrix (graphics->ct, &SavedMatrix); status = MeasureString (graphics, stringUnicode, &StringLen, font, rc, fmt, brush, NULL, NULL, NULL, CleanString, StringDetails, &data); if ((status == Ok) && (StringLen > 0)) { status = DrawString (graphics, stringUnicode, StringLen, font, rc, fmt, brush, CleanString, StringDetails, &data); } /* Restore matrix to original values */ cairo_set_font_matrix (graphics->ct, &SavedMatrix); /* Cleanup */ GdipFree (CleanString); GdipFree (StringDetails); /* we must delete the default stringformat (when one wasn't provided by the caller) */ if (format != fmt) GdipDeleteStringFormat (fmt); return status; }
GpStatus cairo_MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, RectF *boundingBox, int *codepointsFitted, int *linesFilled) { cairo_matrix_t SavedMatrix; GpStringFormat *fmt; GpStringDetailStruct *StringDetails; WCHAR *CleanString; int StringLen = length; GpStatus status; status = AllocStringData (&CleanString, &StringDetails, length); if (status != Ok) return status; /* a NULL format is valid, it means get the generic default values (and free them later) */ if (!format) { GdipStringFormatGetGenericDefault ((GpStringFormat **)&fmt); } else { fmt = (GpStringFormat *)format; } /* is the following ok ? */ cairo_get_font_matrix (graphics->ct, &SavedMatrix); status = MeasureString (graphics, stringUnicode, &StringLen, font, rc, fmt, NULL, boundingBox, codepointsFitted, linesFilled, CleanString, StringDetails, NULL); /* Restore matrix to original values */ cairo_set_font_matrix (graphics->ct, &SavedMatrix); /* Cleanup */ GdipFree (CleanString); GdipFree (StringDetails); /* we must delete the default stringformat (when one wasn't provided by the caller) */ if (format != fmt) GdipDeleteStringFormat (fmt); return status; }
void cairo_context::set_font_matrix(cairo_matrix_t const& matrix) { cairo_set_font_matrix(cairo_.get(), &matrix); check_object_status_and_throw_exception(*this); }
void Context::setFontMatrix( const Matrix &matrix ) { cairo_set_font_matrix( mCairo, &matrix.getCairoMatrix() ); }
void CairoRenderer::RenderOperator(const Operator *pOp, const Object **pParams, int nParams) { const char *cstr; double x, y; double v[6]; int i, n; const Object *pObj; const Stream *pStream; const Dictionary *pDict; cairo_matrix_t matrix; int nWidth, nHeight; cairo_surface_t *pSurface; cstr = pOp->GetValue(); if (strchr("fFbBW", *cstr) != NULL) if (cstr[1] == '\0') cairo_set_fill_rule(m_pCairo, CAIRO_FILL_RULE_WINDING); else if (cstr[1] == '*') cairo_set_fill_rule(m_pCairo, CAIRO_FILL_RULE_EVEN_ODD); if (*cstr == 'b') //close, fill, and stroke { cairo_close_path(m_pCairo); cairo_fill(m_pCairo); Stroke(); } else if (strcmp(cstr, "B") == 0 || strcmp(cstr, "B*") == 0) //fill and stroke { cairo_fill(m_pCairo); Stroke(); } else if (strcmp(cstr, "BDC") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "BI") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "BMC") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "BT") == 0) { cairo_save(m_pCairo); cairo_move_to(m_pCairo, 0.0, 0.0); m_cairo_face = NULL; } else if (strcmp(cstr, "BX") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "c") == 0) //curve to { ConvertNumeric(pParams, nParams, v); cairo_curve_to(m_pCairo, v[0], v[1], v[2], v[3], v[4], v[5]); } else if (strcmp(cstr, "cm") == 0) //concat { ConvertNumeric(pParams, nParams, v); cairo_matrix_init(&matrix, v[0], v[1], v[2], v[3], v[4], v[5]); cairo_transform(m_pCairo, &matrix); } else if (strcmp(cstr, "CS") == 0) //color space { NOT_IMPLEMENTED; } else if (strcmp(cstr, "cs") == 0) //color space { NOT_IMPLEMENTED; } else if (strcmp(cstr, "d") == 0) //line dash SetDash(pParams[0], pParams[1]); else if (strcmp(cstr, "d0") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "d1") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "Do") == 0) { pStream = (const Stream *)GetResource(XOBJECT, ((Name *)pParams[0])->GetValue()); pDict = pStream->GetDictionary(); pObj = pDict->GetValue("Subtype"); if (strcmp(((const Name *)pObj)->GetValue(), "Image") == 0) { nWidth = ((const Numeric *)pDict->GetValue("Width"))->GetValue(); nHeight = ((const Numeric *)pDict->GetValue("Height"))->GetValue(); cairo_matrix_init(&matrix, 1.0 / nWidth, 0.0, 0.0, -1.0 / nHeight, 0.0, 1.0); cairo_save(m_pCairo); cairo_transform(m_pCairo, &matrix); cairo_rectangle(m_pCairo, 0.0, 0.0, nWidth, nHeight); cairo_clip(m_pCairo); pSurface = CreateImageSurface(pStream, nWidth, nHeight); cairo_set_source_surface(m_pCairo, pSurface, 0.0, 0.0); cairo_paint(m_pCairo); cairo_surface_destroy(pSurface); cairo_restore(m_pCairo); } } else if (strcmp(cstr, "DP") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "EI") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "EMC") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "ET") == 0) { cairo_restore(m_pCairo); if (m_cairo_face) { cairo_set_font_face(m_pCairo, NULL); cairo_font_face_destroy(m_cairo_face); } } else if (strcmp(cstr, "EX") == 0) { NOT_IMPLEMENTED; } else if (*cstr == 'f' || *cstr == 'F') //fill cairo_fill(m_pCairo); else if (strcmp(cstr, "G") == 0) { ConvertNumeric(pParams, nParams, v); m_pStrokeColor[0] = v[0]; m_pStrokeColor[1] = v[0]; m_pStrokeColor[2] = v[0]; } else if (strcmp(cstr, "g") == 0) { ConvertNumeric(pParams, nParams, v); cairo_set_source_rgba(m_pCairo, v[0], v[0], v[0], 1.0); } else if (strcmp(cstr, "gs") == 0) //set graphics state SetGraphicsState(((const Name *)pParams[0])->GetValue()); else if (strcmp(cstr, "h") == 0) //close subpath cairo_close_path(m_pCairo); else if (strcmp(cstr, "i") == 0) //flatness tolerance { ConvertNumeric(pParams, nParams, v); cairo_set_tolerance(m_pCairo, v[0]); } else if (strcmp(cstr, "ID") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "j") == 0) //line join { ConvertNumeric(pParams, nParams, v); cairo_set_line_join(m_pCairo, (cairo_line_join_t)v[0]); } else if (strcmp(cstr, "J") == 0) //line cap { ConvertNumeric(pParams, nParams, v); cairo_set_line_cap(m_pCairo, (cairo_line_cap_t)v[0]); } else if (strcmp(cstr, "K") == 0) { ConvertNumeric(pParams, nParams, v); m_pStrokeColor[0] = (1.0 - v[0]) * (1.0 - v[3]); m_pStrokeColor[1] = (1.0 - v[1]) * (1.0 - v[3]); m_pStrokeColor[2] = (1.0 - v[2]) * (1.0 - v[3]); } else if (strcmp(cstr, "k") == 0) { ConvertNumeric(pParams, nParams, v); cairo_set_source_rgba(m_pCairo, (1.0 - v[0]) * (1.0 - v[3]), (1.0 - v[1]) * (1.0 - v[3]), (1.0 - v[2]) * (1.0 - v[3]), 1.0); } else if (strcmp(cstr, "l") == 0) //line to { ConvertNumeric(pParams, nParams, v); cairo_line_to(m_pCairo, v[0], v[1]); } else if (strcmp(cstr, "m") == 0) //new sub path { ConvertNumeric(pParams, nParams, v); cairo_move_to(m_pCairo, v[0], v[1]); } else if (strcmp(cstr, "M") == 0) //miter limit { ConvertNumeric(pParams, nParams, v); cairo_set_miter_limit(m_pCairo, v[0]); } else if (strcmp(cstr, "MP") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "n") == 0) //end path cairo_new_path(m_pCairo); else if (strcmp(cstr, "q") == 0) //save graphics state cairo_save(m_pCairo); else if (strcmp(cstr, "Q") == 0) //restore graphics state cairo_restore(m_pCairo); else if (strcmp(cstr, "re") == 0) //rectangle { ConvertNumeric(pParams, nParams, v); cairo_rectangle(m_pCairo, v[0], v[1], v[2], v[3]); } else if (strcmp(cstr, "RG") == 0) { ConvertNumeric(pParams, nParams, m_pStrokeColor); } else if (strcmp(cstr, "rg") == 0) { ConvertNumeric(pParams, nParams, v); cairo_set_source_rgba(m_pCairo, v[0], v[1], v[2], 1.0); } else if (strcmp(cstr, "ri") == 0) //color rendering intent SetIntent(((const Name *)pParams[0])->GetValue()); else if (strcmp(cstr, "s") == 0) //close and stroke { cairo_close_path(m_pCairo); Stroke(); } else if (strcmp(cstr, "S") == 0) //stroke Stroke(); else if (strcmp(cstr, "SC") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "sc") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "SCN") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "scn") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "sh") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "T*") == 0) { cairo_translate(m_pCairo, 0.0, -m_dTextLead); cairo_move_to(m_pCairo, 0.0, 0.0); } else if (strcmp(cstr, "Tc") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "Td") == 0) { ConvertNumeric(pParams, nParams, v); cairo_translate(m_pCairo, v[0], v[1]); cairo_move_to(m_pCairo, 0.0, 0.0); } else if (strcmp(cstr, "TD") == 0) { ConvertNumeric(pParams, nParams, v); cairo_translate(m_pCairo, v[0], v[1]); cairo_move_to(m_pCairo, 0.0, 0.0); m_dTextLead = -v[1]; } else if (strcmp(cstr, "Tf") == 0) { ChangeFont(((const Name *)pParams[0])->GetValue()); SetFontFace(m_pFontData->GetFontFile()); ConvertNumeric(pParams + 1, nParams - 1, v); cairo_matrix_init_scale(m_pFontMatrix, v[0], -v[0]); cairo_set_font_matrix(m_pCairo, m_pFontMatrix); } else if (strcmp(cstr, "Tj") == 0) RenderString((const String *)pParams[0]); else if (strcmp(cstr, "TJ") == 0) { n = ((const Array *)pParams[0])->GetSize(); for (i = 0; i < n; i++) { pObj = ((const Array *)pParams[0])->GetValue(i); if (pObj->GetType() == Object::OBJ_STRING) RenderString((const String *)pObj); else if (pObj->GetType() == Object::OBJ_NUMERIC) cairo_translate(m_pCairo, -((const Numeric *)pObj)->GetValue() / 1000.0, 0.0); } } else if (strcmp(cstr, "TL") == 0) { ConvertNumeric(pParams, nParams, v); m_dTextLead = v[0]; } else if (strcmp(cstr, "Tm") == 0) { ConvertNumeric(pParams, nParams, v); cairo_matrix_init(&matrix, v[0], v[1], v[2], v[3], v[4], v[5]); cairo_matrix_multiply(&matrix, m_pFontMatrix, &matrix); cairo_set_font_matrix(m_pCairo, &matrix); cairo_move_to(m_pCairo, 0.0, 0.0); } else if (strcmp(cstr, "Tr") == 0) { ConvertNumeric(pParams, nParams, v); m_nTextMode = v[0]; } else if (strcmp(cstr, "Ts") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "Tw") == 0) { NOT_IMPLEMENTED; } else if (strcmp(cstr, "Tz") == 0) { ConvertNumeric(pParams, nParams, v); cairo_scale(m_pCairo, v[0] / 100.0, 1.0); } else if (strcmp(cstr, "v") == 0) //curve to { ConvertNumeric(pParams, nParams, v); cairo_get_current_point(m_pCairo, &x, &y); cairo_curve_to(m_pCairo, x, y, v[0], v[1], v[2], v[3]); } else if (strcmp(cstr, "w") == 0) //line width { ConvertNumeric(pParams, nParams, v); cairo_set_line_width(m_pCairo, v[0] + 0.5); } else if (*cstr == 'W') //clipping path cairo_clip(m_pCairo); else if (strcmp(cstr, "y") == 0) //curve to { ConvertNumeric(pParams, nParams, v); cairo_curve_to(m_pCairo, v[0], v[1], v[2], v[3], v[2], v[3]); } else if (strcmp(cstr, "'") == 0) { cairo_translate(m_pCairo, 0.0, -m_dTextLead); cairo_move_to(m_pCairo, 0.0, 0.0); RenderString((const String *)pParams[0]); } else if (strcmp(cstr, "\"") == 0) { cairo_translate(m_pCairo, 0.0, -m_dTextLead); cairo_move_to(m_pCairo, 0.0, 0.0); RenderString((const String *)pParams[2]); } else { assert(false); } }
static void render_spect_border (cairo_surface_t * surface, const char * filename, double left, double width, double seconds, double top, double height, double min_freq, double max_freq, bool log_freq) { char text [512] ; cairo_t * cr ; cairo_text_extents_t extents ; cairo_matrix_t matrix ; TICKS ticks ; int k, tick_count ; cr = cairo_create (surface) ; cairo_set_source_rgb (cr, 1.0, 1.0, 1.0) ; cairo_set_line_width (cr, BORDER_LINE_WIDTH) ; /* Print title. */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL) ; cairo_set_font_size (cr, 1.0 * TITLE_FONT_SIZE) ; snprintf (text, sizeof (text), "Spectrogram: %s", filename) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + 2, top - extents.height / 2) ; cairo_show_text (cr, text) ; /* Print labels. */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL) ; cairo_set_font_size (cr, 1.0 * NORMAL_FONT_SIZE) ; /* Border around actual spectrogram. */ cairo_rectangle (cr, left, top, width, height) ; /* Put ticks on Time axis */ tick_count = calculate_ticks (0.0, seconds, width, false, &ticks) ; for (k = 0 ; k < tick_count ; k++) { y_line (cr, left + ticks.distance [k], top + height, TICK_LEN) ; if (JUST_A_TICK (ticks, k)) continue ; str_print_value (text, sizeof (text), ticks.value [k], ticks.decimal_places_to_print) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + ticks.distance [k] - extents.width / 2, top + height + 8 + extents.height) ; cairo_show_text (cr, text) ; } ; /* Put ticks on Frequency axis */ tick_count = calculate_ticks (min_freq, max_freq, height, log_freq, &ticks) ; for (k = 0 ; k < tick_count ; k++) { x_line (cr, left + width, top + height - ticks.distance [k], TICK_LEN) ; if (JUST_A_TICK (ticks, k)) continue ; str_print_value (text, sizeof (text), ticks.value [k], ticks.decimal_places_to_print) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + width + 12, top + height - ticks.distance [k] + extents.height / 4.5) ; cairo_show_text (cr, text) ; } ; cairo_set_font_size (cr, 1.0 * NORMAL_FONT_SIZE) ; /* Label X axis. */ snprintf (text, sizeof (text), "Time (secs)") ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + (width - extents.width) / 2, cairo_image_surface_get_height (surface) - 8) ; cairo_show_text (cr, text) ; /* Label Y axis (rotated). */ snprintf (text, sizeof (text), "Frequency (Hz)") ; cairo_text_extents (cr, text, &extents) ; cairo_get_font_matrix (cr, &matrix) ; cairo_matrix_rotate (&matrix, -0.5 * M_PI) ; cairo_set_font_matrix (cr, &matrix) ; cairo_move_to (cr, cairo_image_surface_get_width (surface) - 12, top + (height + extents.width) / 2) ; cairo_show_text (cr, text) ; cairo_destroy (cr) ; } /* render_spect_border */
static cairo_time_t do_hash_table (cairo_t *cr, int width, int height, int loops) { /* * Microsoft C Compiler complains that: * error C2466: cannot allocate an array of constant size 0 * so we add an unused element to make it happy */ cairo_scaled_font_t *active_fonts[ACTIVE_FONTS + 1]; cairo_matrix_t m; int i; cairo_matrix_init_identity (&m); /* Touch HOLDOVERS scaled fonts to fill up the holdover list. */ for (i = 0; i < HOLDOVERS; i++) { m.yy = m.xx * (i + 1); cairo_set_font_matrix (cr, &m); cairo_get_scaled_font (cr); } /* * Reference some scaled fonts so that they will be kept in the * scaled fonts map. We want LIVE_ENTRIES elements in the font * map, but cairo keeps HOLDOVERS recently used fonts in it and we * will be activating a new font in the cr context, so we just * keep references to ACTIVE_FONTS fonts. * * Note: setting LIVE_ENTRIES == HOLDOVERS+1 means that we keep no * font in active_fonts and the slowness is caused by the holdover * fonts only. */ for (i = 0; i < ACTIVE_FONTS; i++) { cairo_scaled_font_t *scaled_font; m.yy = m.xx * (i + 1); cairo_set_font_matrix (cr, &m); scaled_font = cairo_get_scaled_font (cr); active_fonts[i] = cairo_scaled_font_reference (scaled_font); } cairo_perf_timer_start (); cairo_perf_set_thread_aware (cr, FALSE); while (loops--) { if (loops == 0) cairo_perf_set_thread_aware (cr, TRUE); m.xx += 1.0; /* Generate ITER new scaled fonts per loop */ for (i = 0; i < ITER; i++) { m.yy = m.xx * (i + 1); cairo_set_font_matrix (cr, &m); cairo_get_scaled_font (cr); } } cairo_perf_timer_stop (); for (i = 0; i < ACTIVE_FONTS; i++) cairo_scaled_font_destroy (active_fonts[i]); return cairo_perf_timer_elapsed (); }