static void gst_time_overlay_class_init (GstTimeOverlayClass * klass) { GstTextOverlayClass *gsttextoverlay_class; PangoContext *context; PangoFontDescription *font_description; gsttextoverlay_class = (GstTextOverlayClass *) klass; gsttextoverlay_class->get_text = gst_time_overlay_get_text; g_mutex_lock (GST_TEXT_OVERLAY_CLASS (klass)->pango_lock); context = GST_TEXT_OVERLAY_CLASS (klass)->pango_context; pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family_static (font_description, "Monospace"); pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); pango_font_description_set_size (font_description, 18 * PANGO_SCALE); pango_context_set_font_description (context, font_description); pango_font_description_free (font_description); g_mutex_unlock (GST_TEXT_OVERLAY_CLASS (klass)->pango_lock); }
static void gst_time_overlay_init (GstTimeOverlay * overlay, GstTimeOverlayClass * klass) { PangoFontDescription *font_description; GstTextOverlay *textoverlay; PangoContext *context; textoverlay = GST_TEXT_OVERLAY (overlay); context = GST_TEXT_OVERLAY_CLASS (klass)->pango_context; pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family_static (font_description, "Monospace"); pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); pango_font_description_set_size (font_description, 18 * PANGO_SCALE); pango_context_set_font_description (context, font_description); pango_font_description_free (font_description); textoverlay->valign = GST_TEXT_OVERLAY_VALIGN_TOP; textoverlay->halign = GST_TEXT_OVERLAY_HALIGN_LEFT; }
JNIEXPORT void JNICALL Java_org_gnome_pango_PangoFontDescription_pango_1font_1description_1set_1family_1static ( JNIEnv* env, jclass cls, jlong _self, jstring _family ) { PangoFontDescription* self; const char* family; // convert parameter self self = (PangoFontDescription*) _self; // convert parameter family family = (const char*) bindings_java_getString(env, _family); if (family == NULL) { return; // Java Exception already thrown } // call function pango_font_description_set_family_static(self, family); // cleanup parameter self // cleanup parameter family bindings_java_releaseString(family); }
int tag_func_define_font_info (SwfdecSwfDecoder *s, guint tag) { SwfdecFont *font; guint id, len, i; int reserved, wide, ansi, jis; char *name; /* we just assume Latin1 (FIXME: option to change this?) */ SwfdecLanguage language = SWFDEC_LANGUAGE_LATIN; id = swfdec_bits_get_u16 (&s->b); font = swfdec_swf_decoder_get_character (s, id); if (!SWFDEC_IS_FONT (font)) { SWFDEC_WARNING ("didn't find a font with id %u", id); return SWFDEC_STATUS_OK; } len = swfdec_bits_get_u8 (&s->b); /* this string is locale specific */ name = swfdec_bits_get_string_length (&s->b, len, s->version); reserved = swfdec_bits_getbits (&s->b, 2); font->small = swfdec_bits_getbit (&s->b); jis = swfdec_bits_getbit (&s->b); ansi = swfdec_bits_getbit (&s->b); if (jis != 0 || ansi != 0) { SWFDEC_LOG ("ansi = %d, jis = %d", ansi, jis); if (tag == SWFDEC_TAG_DEFINEFONTINFO2) SWFDEC_INFO ("ANSI and JIS flags are supposed to be 0 in DefineFontInfo"); if (jis) language = SWFDEC_LANGUAGE_JAPANESE; } font->italic = swfdec_bits_getbit (&s->b); font->bold = swfdec_bits_getbit (&s->b); wide = swfdec_bits_getbit (&s->b); if (tag == SWFDEC_TAG_DEFINEFONTINFO2) language = swfdec_bits_get_u8 (&s->b); g_free (name); if (font->name) { SWFDEC_LOG ("Creating font description for font %d", id); font->desc = pango_font_description_new (); pango_font_description_set_family_static (font->desc, font->name); if (font->bold) pango_font_description_set_weight (font->desc, PANGO_WEIGHT_BOLD); if (font->italic) pango_font_description_set_style (font->desc, PANGO_STYLE_ITALIC); } for (i = 0; i < font->glyphs->len; i++) { g_array_index (font->glyphs, SwfdecFontEntry, i).value = wide ? swfdec_bits_get_u16 (&s->b) : swfdec_bits_get_u8 (&s->b); } return SWFDEC_STATUS_OK; }
static void gst_imx_g2d_time_overlay_class_init (GstImxG2DTimeOverlayClass * klass) { GstElementClass *gstelement_class; GstImxG2DBaseTextOverlayClass *gsttextoverlay_class; GObjectClass *gobject_class; PangoContext *context; PangoFontDescription *font_description; gsttextoverlay_class = (GstImxG2DBaseTextOverlayClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; gst_element_class_set_static_metadata (gstelement_class, "Time overlay", "Filter/Editor/Video", "Overlays buffer time stamps on a video stream", "Tim-Philipp Müller <*****@*****.**>"); gsttextoverlay_class->get_text = gst_imx_g2d_time_overlay_get_text; gobject_class->set_property = gst_imx_g2d_time_overlay_set_property; gobject_class->get_property = gst_imx_g2d_time_overlay_get_property; g_object_class_install_property (gobject_class, PROP_TIME_LINE, g_param_spec_enum ("time-mode", "Time Mode", "What time to show", GST_TYPE_IMX_G2D_TIME_OVERLAY_TIME_LINE, DEFAULT_TIME_LINE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TIMEALIGNMENT, g_param_spec_enum ("time-alignment", "Time alignment", "Time alignment of the text", GST_TYPE_IMX_G2D_TIME_OVERLAY_TIMEALIGN, DEFAULT_PROP_TIMEALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_mutex_lock (gsttextoverlay_class->pango_lock); context = gsttextoverlay_class->pango_context; pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family_static (font_description, "Monospace"); pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); pango_font_description_set_size (font_description, 18 * PANGO_SCALE); pango_context_set_font_description (context, font_description); pango_font_description_free (font_description); g_mutex_unlock (gsttextoverlay_class->pango_lock); }
/** * ppg_ruler_init: * @ruler: (in): A #PpgRuler. * * Initializes the newly created #PpgRuler instance. * * Returns: None. * Side effects: None. */ static void ppg_ruler_init (PpgRuler *ruler) { PpgRulerPrivate *priv; priv = ruler->priv = G_TYPE_INSTANCE_GET_PRIVATE(ruler, PPG_TYPE_RULER, PpgRulerPrivate); gtk_widget_add_events(GTK_WIDGET(ruler), GDK_POINTER_MOTION_MASK); priv->font_desc = pango_font_description_new(); pango_font_description_set_family_static(priv->font_desc, "Monospace"); pango_font_description_set_size(priv->font_desc, 8 * PANGO_SCALE); }
/** * ppg_rt_graph_init: * @graph: (in): A #PpgRtGraph. * * Initializes the newly created #PpgRtGraph instance. * * Returns: None. * Side effects: None. */ static void ppg_rt_graph_init (PpgRtGraph *graph) { PpgRtGraphPrivate *priv; priv = G_TYPE_INSTANCE_GET_PRIVATE(graph, PPG_TYPE_RT_GRAPH, PpgRtGraphPrivate); graph->priv = priv; priv->n_seconds = 60.0; priv->n_buffered = 1.0; priv->font_desc = pango_font_description_new(); pango_font_description_set_family_static(priv->font_desc, "Monospace"); pango_font_description_set_size(priv->font_desc, PANGO_SCALE * 8); }
static void gst_clock_overlay_class_init (GstClockOverlayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseTextOverlayClass *gsttextoverlay_class; PangoContext *context; PangoFontDescription *font_description; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gsttextoverlay_class = (GstBaseTextOverlayClass *) klass; gobject_class->finalize = gst_clock_overlay_finalize; gobject_class->set_property = gst_clock_overlay_set_property; gobject_class->get_property = gst_clock_overlay_get_property; gst_element_class_set_static_metadata (gstelement_class, "Clock overlay", "Filter/Editor/Video", "Overlays the current clock time on a video stream", "Tim-Philipp Müller <*****@*****.**>"); gsttextoverlay_class->get_text = gst_clock_overlay_get_text; g_object_class_install_property (gobject_class, PROP_TIMEFORMAT, g_param_spec_string ("time-format", "Date/Time Format", "Format to use for time and date value, as in strftime.", DEFAULT_PROP_TIMEFORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_mutex_lock (gsttextoverlay_class->pango_lock); context = gsttextoverlay_class->pango_context; pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family_static (font_description, "Monospace"); pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); pango_font_description_set_size (font_description, 18 * PANGO_SCALE); pango_context_set_font_description (context, font_description); pango_font_description_free (font_description); g_mutex_unlock (gsttextoverlay_class->pango_lock); }
static void hippo_canvas_context_win_init(HippoCanvasContextWin *canvas_win) { PangoFontDescription *desc; canvas_win->pointer = HIPPO_CANVAS_POINTER_UNSET; /* canvas_win->pango = pango_win32_get_context(); */ PangoCairoFontMap *font_map = (PangoCairoFontMap*) pango_cairo_font_map_get_default(); canvas_win->pango = pango_cairo_font_map_create_context(font_map); g_object_unref((void*) font_map); desc = pango_font_description_new(); // Note that this matches the web font in our site.css // We only set Arial instead of Arial, sans-serif because // pango cairo doesn't like a font list here. pango_font_description_set_family_static(desc, "Arial"); pango_font_description_set_absolute_size(desc, 12 * PANGO_SCALE); // FIXME on my laptop (Visual Studio 2005) this has crashed Pango with a g_error(), // but it seems to have mysteriously gone away. pango_context_set_font_description(canvas_win->pango, desc); pango_font_description_free(desc); }
static void gst_clock_overlay_class_init (GstClockOverlayClass * klass) { GObjectClass *gobject_class; GstTextOverlayClass *gsttextoverlay_class; PangoContext *context; PangoFontDescription *font_description; gobject_class = (GObjectClass *) klass; gsttextoverlay_class = (GstTextOverlayClass *) klass; gobject_class->finalize = gst_clock_overlay_finalize; gobject_class->set_property = gst_clock_overlay_set_property; gobject_class->get_property = gst_clock_overlay_get_property; gsttextoverlay_class->get_text = gst_clock_overlay_get_text; g_object_class_install_property (gobject_class, PROP_TIMEFORMAT, g_param_spec_string ("time-format", "Date/Time Format", "Format to use for time and date value, as in strftime.", DEFAULT_PROP_TIMEFORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_mutex_lock (GST_TEXT_OVERLAY_CLASS (klass)->pango_lock); context = GST_TEXT_OVERLAY_CLASS (klass)->pango_context; pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family_static (font_description, "Monospace"); pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); pango_font_description_set_size (font_description, 18 * PANGO_SCALE); pango_context_set_font_description (context, font_description); pango_font_description_free (font_description); g_mutex_unlock (GST_TEXT_OVERLAY_CLASS (klass)->pango_lock); }
static void hippo_canvas_context_win_init(HippoCanvasContextWin *canvas_win) { PangoFontDescription *desc; canvas_win->pointer = HIPPO_CANVAS_POINTER_UNSET; /* canvas_win->pango = pango_win32_get_context(); */ PangoCairoFontMap *font_map = (PangoCairoFontMap*) pango_cairo_font_map_get_default(); canvas_win->pango = pango_cairo_font_map_create_context(font_map); g_object_unref((void*) font_map); desc = pango_font_description_new(); // Sans is resolved in the pango.aliases we install; since the first element // is already "Arial", we specify just Sans here, rather than the "Arial,sans-serif" // we use in site.css. pango_font_description_set_family_static(desc, "Sans"); pango_font_description_set_absolute_size(desc, 12 * PANGO_SCALE); // FIXME on my laptop (Visual Studio 2005) this has crashed Pango with a g_error(), // but it seems to have mysteriously gone away. pango_context_set_font_description(canvas_win->pango, desc); pango_font_description_free(desc); }
static gboolean font_description_value_parse (GtkCssParser *parser, GValue *value) { PangoFontDescription *font_desc; guint mask; char *str; str = _gtk_css_parser_read_value (parser); if (str == NULL) return FALSE; font_desc = pango_font_description_from_string (str); mask = pango_font_description_get_set_fields (font_desc); /* These values are not really correct, * but the fields must be set, so we set them to something */ if ((mask & PANGO_FONT_MASK_FAMILY) == 0) pango_font_description_set_family_static (font_desc, "Sans"); if ((mask & PANGO_FONT_MASK_SIZE) == 0) pango_font_description_set_size (font_desc, 10 * PANGO_SCALE); g_free (str); g_value_take_boxed (value, font_desc); return TRUE; }
gboolean cd_do_render_listing_notification (gpointer pUserData, CDListing *pListing, cairo_t *pCairoContext) { //g_print ("%s ()\n", __func__); int iWidth = pListing->container.iWidth, iHeight = pListing->container.iHeight; int iLeftMargin = myDialogs.dialogTextDescription.iSize + 2, iRightMargin = (myDialogs.dialogTextDescription.iSize + 2) / 2; int iTopMargin = (myDialogs.dialogTextDescription.iSize + 2) + GAP, iBottomMargin = (myDialogs.dialogTextDescription.iSize + 2) * 4 + GAP; CDEntry *pEntry; // on dessine un cadre et un fond double fRadius = MIN (6, myDialogs.dialogTextDescription.iSize/2+1); double fLineWidth = 1.; cairo_set_line_width (pCairoContext, fLineWidth); cairo_save (pCairoContext); cairo_translate (pCairoContext, 0, fLineWidth); cairo_dock_draw_rounded_rectangle (pCairoContext, fRadius, fLineWidth, iWidth - 2 * fRadius - fLineWidth, iTopMargin - GAP); cairo_set_source_rgba (pCairoContext, .8, .8, 1., 1.); cairo_stroke_preserve (pCairoContext); cairo_set_source_rgba (pCairoContext, 1., 1., 1., .7); cairo_fill (pCairoContext); cairo_translate (pCairoContext, 0, iTopMargin + fLineWidth); cairo_dock_draw_rounded_rectangle (pCairoContext, fRadius, fLineWidth, iWidth - 2 * fRadius - fLineWidth, iHeight - iTopMargin - iBottomMargin - GAP); cairo_set_source_rgba (pCairoContext, .8, .8, 1., 1.); cairo_stroke_preserve (pCairoContext); cairo_set_source_rgba (pCairoContext, 1., 1., 1., .7); cairo_fill (pCairoContext); cairo_translate (pCairoContext, 0, iHeight - iTopMargin - 2*fLineWidth - iBottomMargin + GAP); cairo_dock_draw_rounded_rectangle (pCairoContext, fRadius, fLineWidth, iWidth - 2 * fRadius - fLineWidth, iBottomMargin - GAP - fLineWidth); cairo_set_source_rgba (pCairoContext, .8, .8, 1., 1.); cairo_stroke_preserve (pCairoContext); cairo_set_source_rgba (pCairoContext, 1., 1., 1., .7); cairo_fill (pCairoContext); cairo_restore (pCairoContext); PangoLayout *pLayout = pango_cairo_create_layout (pCairoContext); PangoFontDescription *pDesc = pango_font_description_new (); pango_font_description_set_absolute_size (pDesc, myDialogs.dialogTextDescription.iSize * PANGO_SCALE); pango_font_description_set_family_static (pDesc, myDialogs.dialogTextDescription.cFont); pango_font_description_set_weight (pDesc, myDialogs.dialogTextDescription.iWeight); pango_font_description_set_style (pDesc, myLabels.iconTextDescription.iStyle); pango_layout_set_font_description (pLayout, pDesc); pango_font_description_free (pDesc); // on dessine les entrees. if (pListing->pEntries != NULL) { // on dessine chaque entree. int iNbSteps = _listing_compute_nb_steps (pListing); // nb d'etapes pour l'apparition du texte. int iOffsetX = NB_STEPS_FOR_1_ENTRY - (iNbSteps - pListing->iAppearanceAnimationCount) - 1; if (pListing->iNbEntries >= myConfig.iNbLinesInListing) iOffsetX += myConfig.iNbLinesInListing/4*NB_STEPS_LATE; // permet de donner une transparence aux 25% dernieres lignes. double dx, dy, dm = myConfig.iNbLinesInListing * (myDialogs.dialogTextDescription.iSize + 2) / 2; dm = 0; dy = iTopMargin - pListing->fCurrentOffset + 1 + dm; double ymax = MIN (iTopMargin + pListing->iNbEntries * (myDialogs.dialogTextDescription.iSize + 2), iHeight - iBottomMargin); GList *e; for (e = pListing->pEntries; e != NULL; e = e->next) { if (iOffsetX >= NB_STEPS_FOR_1_ENTRY) // en dehors a droite a partir de celui-ci. break ; pEntry = e->data; if (pEntry->bHidden) continue ; dx = myDialogs.dialogTextDescription.iSize + 2; // marge a gauche. //if (iOffsetX > 0 && pListing->iAppearanceAnimationCount > 0) // dx += (double) iOffsetX * (iWidth - (myDialogs.dialogTextDescription.iSize + 2)) / NB_STEPS_FOR_1_ENTRY; dy += (myDialogs.dialogTextDescription.iSize + 2); while (dy + myDialogs.dialogTextDescription.iSize + 2 <= iTopMargin + 1) dy += pListing->iNbEntries * (myDialogs.dialogTextDescription.iSize + 2); while (dy > ymax) dy -= pListing->iNbEntries * (myDialogs.dialogTextDescription.iSize + 2); if (dy > ymax || dy + myDialogs.dialogTextDescription.iSize + 2 <= iTopMargin + 1) continue; cairo_save (pCairoContext); cairo_translate (pCairoContext, dx, dy); // on fait un clip si necessaire. if (dy + myDialogs.dialogTextDescription.iSize + 2 > iHeight - iBottomMargin || dy < iTopMargin) // cette entree n'est que partiellement visible. { if (dy < iTopMargin) // elle depasse en haut. cairo_rectangle (pCairoContext, -iLeftMargin, iTopMargin - dy, iWidth, myDialogs.dialogTextDescription.iSize + 2 -(iTopMargin - dy)); else // elle depasse en bas. cairo_rectangle (pCairoContext, -iLeftMargin, 0, iWidth, iHeight - iBottomMargin - dy); cairo_clip (pCairoContext); } // on dessine l'icone. if (pEntry->pIconSurface != NULL) { cairo_set_source_surface (pCairoContext, pEntry->pIconSurface, - iLeftMargin + 1, 0.); cairo_paint (pCairoContext); } // on souligne l'entree courante. if (e == pListing->pCurrentEntry) { double f = 1. - (double) pListing->iCurrentEntryAnimationCount / NB_STEPS_FOR_CURRENT_ENTRY; if (f != 0) { cairo_save (pCairoContext); double rx = .5*(iWidth - iLeftMargin - iRightMargin); double ry = .5*(myDialogs.dialogTextDescription.iSize + 2); cairo_pattern_t *pPattern = cairo_pattern_create_radial (ry, ry, 0., ry, ry, f * ry); cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_NONE); cairo_pattern_add_color_stop_rgba (pPattern, 0., 0., 0., 1., .3); cairo_pattern_add_color_stop_rgba (pPattern, 1., 0., 0., 0., 0.); cairo_scale (pCairoContext, rx/ry, 1.); cairo_set_source (pCairoContext, pPattern); cairo_paint (pCairoContext); cairo_pattern_destroy (pPattern); cairo_restore (pCairoContext); // on dessine l'indicateur de sous-listing. if (pEntry->list != NULL) { cairo_set_source_rgba (pCairoContext, 0., 0., 0., f); cairo_move_to (pCairoContext, iWidth - iLeftMargin - iRightMargin, myDialogs.dialogTextDescription.iSize/4); cairo_rel_line_to (pCairoContext, iRightMargin, myDialogs.dialogTextDescription.iSize/4); cairo_rel_line_to (pCairoContext, -iRightMargin, myDialogs.dialogTextDescription.iSize/4); cairo_close_path (pCairoContext); cairo_stroke (pCairoContext); } } } // on dessine le texte. cairo_set_source_rgba (pCairoContext, 0., 0., 0., 1. - (double) iOffsetX / NB_STEPS_FOR_1_ENTRY); pango_layout_set_text (pLayout, pEntry->cName, -1); pango_cairo_show_layout (pCairoContext, pLayout); // on separe la 1ere entree de la derniere. if (e->prev == NULL) { cairo_set_source_rgba (pCairoContext, 0., 0., 0., .5); cairo_move_to (pCairoContext, 0., 1.); cairo_rel_line_to (pCairoContext, iWidth - iLeftMargin - iRightMargin, 0.); double dashes = 2.; cairo_set_dash (pCairoContext, &dashes, 1, 0.); cairo_stroke (pCairoContext); cairo_set_dash (pCairoContext, &dashes, 0, 0.); } cairo_restore (pCairoContext); iOffsetX += NB_STEPS_LATE; } // on dessine le chemin de l'entree courante. if (pListing->pCurrentEntry) { pEntry = pListing->pCurrentEntry->data; cairo_save (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); cairo_translate (pCairoContext, fRadius - pListing->iTitleOffset, 0.); pango_layout_set_text (pLayout, pEntry->cPath ? pEntry->cPath : pEntry->cName, -1); PangoRectangle ink, log; pango_layout_get_pixel_extents (pLayout, &ink, &log); pListing->iTitleWidth = ink.width; pango_cairo_show_layout (pCairoContext, pLayout); cairo_restore (pCairoContext); } } // on dessine l'etat de la recherche. cairo_translate (pCairoContext, 0, iHeight - iBottomMargin); cairo_set_source_surface (pCairoContext, myData.pScoobySurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); cairo_translate (pCairoContext, 2 * (myDialogs.dialogTextDescription.iSize + 2), GAP); if (myData.cStatus != NULL) { pango_layout_set_text (pLayout, myData.cStatus, -1); } pango_cairo_show_layout (pCairoContext, pLayout); // on dessine le filtre. cairo_translate (pCairoContext, 0., myDialogs.dialogTextDescription.iSize + 2); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_MATCH_CASE) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F1) Match case"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, iWidth/3, 0.); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_MUSIC) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F2) Music"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, iWidth/3, 0.); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_IMAGE) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F3) Image"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, -2*iWidth/3, myDialogs.dialogTextDescription.iSize + 2); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_VIDEO) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F4) Video"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, iWidth/3, 0.); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_TEXT) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F5) Text"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, iWidth/3, 0.); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_HTML) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F6) Html"), -1); pango_cairo_show_layout (pCairoContext, pLayout); cairo_translate (pCairoContext, -2*iWidth/3, myDialogs.dialogTextDescription.iSize + 2); cairo_set_source_surface (pCairoContext, (myData.iCurrentFilter & DO_TYPE_SOURCE) ? myData.pActiveButtonSurface : myData.pInactiveButtonSurface, 0., 0.); cairo_paint (pCairoContext); cairo_set_source_rgb (pCairoContext, 0., 0., 0.); pango_layout_set_text (pLayout, D_("(F7) Sources"), -1); pango_cairo_show_layout (pCairoContext, pLayout); g_object_unref (pLayout); }
static void draw_controls (VidState *s) { int i; if (s->control) { for (i = 0; i < s->num_controls; i++) { ControlInfo * ci = s->control_info + i; if (ci->widget) gtk_widget_destroy (ci->widget); if (ci->label) gtk_widget_destroy (ci->label); if (ci->labelval) gtk_widget_destroy (ci->labelval); } free (s->control_info); s->control_info = NULL; input_free_controls (s->control, s->num_controls); s->control = NULL; } s->control = input_enum_controls (videoIn, &s->num_controls); //fprintf(stderr,"V4L2_CID_BASE=0x%x\n",V4L2_CID_BASE); //fprintf(stderr,"V4L2_CID_PRIVATE_BASE=0x%x\n",V4L2_CID_PRIVATE_BASE); //fprintf(stderr,"V4L2_CID_PRIVATE_LAST=0x%x\n",V4L2_CID_PRIVATE_LAST); fprintf(stderr,"Controls:\n"); for (i = 0; i < s->num_controls; i++) { fprintf(stderr,"control[%d]: 0x%x",i,s->control[i].id); fprintf (stderr," %s, %d:%d:%d, default %d\n", s->control[i].name, s->control[i].min, s->control[i].step, s->control[i].max, s->control[i].default_val); } if((s->control_info = malloc (s->num_controls * sizeof (ControlInfo)))==NULL){ printf("couldn't allocate memory for: s->control_info\n"); exit(1); } for (i = 0; i < s->num_controls; i++) { ControlInfo * ci = s->control_info + i; InputControl * c = s->control + i; ci->idx = i; ci->widget = NULL; ci->label = NULL; ci->labelval = NULL; if (c->id == V4L2_CID_EXPOSURE_AUTO) { int val; ci->widget = gtk_check_button_new_with_label (c->name); g_object_set_data (G_OBJECT (ci->widget), "control_info", ci); gtk_widget_show (ci->widget); gtk_table_attach (GTK_TABLE (s->table), ci->widget, 1, 3, 3+i, 4+i, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0, 0); if (input_get_control (videoIn, c, &val) == 0) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ci->widget), val==AUTO_EXP ? TRUE : FALSE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ci->widget), c->default_val==AUTO_EXP ? TRUE : FALSE); gtk_widget_set_sensitive (ci->widget, FALSE); } if (!c->enabled) { gtk_widget_set_sensitive (ci->widget, FALSE); } g_signal_connect (G_OBJECT (ci->widget), "toggled", G_CALLBACK (check_changed), s); } else if (c->type == INPUT_CONTROL_TYPE_INTEGER) { PangoFontDescription * desc; int val; if (c->step == 0) c->step = 1; ci->widget = gtk_hscale_new_with_range (c->min, c->max, c->step); gtk_scale_set_draw_value (GTK_SCALE (ci->widget), FALSE); /* This is a hack to use always round the HScale to integer * values. Strangely, this functionality is normally only * available when draw_value is TRUE. */ GTK_RANGE (ci->widget)->round_digits = 0; gtk_table_attach (GTK_TABLE (s->table), ci->widget, 1, 2, 3+i, 4+i, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0, 0); g_object_set_data (G_OBJECT (ci->widget), "control_info", ci); ci->maxchars = MAX (num_chars (c->min), num_chars (c->max)); gtk_widget_show (ci->widget); ci->labelval = gtk_label_new (NULL); gtk_table_attach (GTK_TABLE (s->table), ci->labelval, 2, 3, 3+i, 4+i, GTK_FILL, 0, 0, 0); desc = pango_font_description_new (); pango_font_description_set_family_static (desc, "monospace"); gtk_widget_modify_font (ci->labelval, desc); gtk_misc_set_alignment (GTK_MISC (ci->labelval), 1, 0.5); if (input_get_control (videoIn, c, &val) == 0) { gtk_range_set_value (GTK_RANGE (ci->widget), val); } else { gtk_range_set_value (GTK_RANGE (ci->widget), c->default_val); gtk_widget_set_sensitive (ci->widget, FALSE); gtk_widget_set_sensitive (ci->labelval, FALSE); } if (!c->enabled) { gtk_widget_set_sensitive (ci->widget, FALSE); gtk_widget_set_sensitive (ci->labelval, FALSE); } set_slider_label (GTK_RANGE (ci->widget)); g_signal_connect (G_OBJECT (ci->widget), "value-changed", G_CALLBACK (slider_changed), s); gtk_widget_show (ci->labelval); ci->label = gtk_label_new (g_strdup_printf ("%s:", c->name)); } else if (c->type == INPUT_CONTROL_TYPE_BOOLEAN) { int val; ci->widget = gtk_check_button_new_with_label (c->name); g_object_set_data (G_OBJECT (ci->widget), "control_info", ci); gtk_widget_show (ci->widget); gtk_table_attach (GTK_TABLE (s->table), ci->widget, 1, 3, 3+i, 4+i, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0, 0); if (input_get_control (videoIn, c, &val) == 0) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ci->widget), val ? TRUE : FALSE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ci->widget), c->default_val ? TRUE : FALSE); gtk_widget_set_sensitive (ci->widget, FALSE); } if (!c->enabled) { gtk_widget_set_sensitive (ci->widget, FALSE); } g_signal_connect (G_OBJECT (ci->widget), "toggled", G_CALLBACK (check_changed), s); } else if (c->type == INPUT_CONTROL_TYPE_MENU) { int val, j; ci->widget = gtk_combo_box_new_text (); for (j = 0; j <= c->max; j++) { gtk_combo_box_append_text (GTK_COMBO_BOX (ci->widget), c->entries[j]); } gtk_table_attach (GTK_TABLE (s->table), ci->widget, 1, 3, 3+i, 4+i, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0, 0); g_object_set_data (G_OBJECT (ci->widget), "control_info", ci); gtk_widget_show (ci->widget); if (input_get_control (videoIn, c, &val) == 0) { gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), val); } else { gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), c->default_val); gtk_widget_set_sensitive (ci->widget, FALSE); } if (!c->enabled) { gtk_widget_set_sensitive (ci->widget, FALSE); } g_signal_connect (G_OBJECT (ci->widget), "changed", G_CALLBACK (combo_changed), s); ci->label = gtk_label_new (g_strdup_printf ("%s:", c->name)); } else { fprintf (stderr, "TODO: implement menu and button\n"); continue; } if (ci->label) { gtk_misc_set_alignment (GTK_MISC (ci->label), 1, 0.5); gtk_table_attach (GTK_TABLE (s->table), ci->label, 0, 1, 3+i, 4+i, GTK_FILL, 0, 0, 0); gtk_widget_show (ci->label); } } }
cairo_surface_t* render_text_to_surface (gchar* text, gint width, gint height, const cairo_font_options_t* font_opts, gdouble dpi) { cairo_surface_t* surface; cairo_t* cr; PangoFontDescription* desc; PangoLayout* layout; // sanity check if (!text || width <= 0 || height <= 0) return NULL; // create surface surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) return NULL; // create context cr = cairo_create (surface); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (surface); return NULL; } // clear context cairo_scale (cr, 1.0f, 1.0f); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); // layout = pango_cairo_create_layout (cr); desc = pango_font_description_new (); pango_font_description_set_size (desc, 12 * PANGO_SCALE); pango_font_description_set_family_static (desc, "Candara"); pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL); pango_font_description_set_style (desc, PANGO_STYLE_NORMAL); pango_layout_set_wrap (layout, PANGO_WRAP_WORD); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); pango_layout_set_width (layout, width * PANGO_SCALE); pango_layout_set_height (layout, height * PANGO_SCALE); pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); // print and layout string (pango-wise) pango_layout_set_text (layout, text, -1); // make sure system-wide font-options like hinting, antialiasing etc. // are taken into account pango_cairo_context_set_font_options (pango_layout_get_context (layout), font_opts); pango_cairo_context_set_resolution (pango_layout_get_context (layout), dpi); pango_layout_context_changed (layout); // draw pango-text to our cairo-context cairo_move_to (cr, 0.0f, 0.0f); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba (cr, 1.0f, 1.0f, 1.0f, 1.0f); // this call leaks 3803 bytes, I've no idea how to fix that pango_cairo_show_layout (cr, layout); // clean up g_object_unref (layout); cairo_destroy (cr); return surface; }
static PangoLayout * rsvg_text_create_layout (RsvgDrawingCtx * ctx, RsvgState * state, const char *text, PangoContext * context) { PangoFontDescription *font_desc; PangoLayout *layout; PangoAttrList *attr_list; PangoAttribute *attribute; if (state->lang) pango_context_set_language (context, pango_language_from_string (state->lang)); if (state->unicode_bidi == UNICODE_BIDI_OVERRIDE || state->unicode_bidi == UNICODE_BIDI_EMBED) pango_context_set_base_dir (context, state->text_dir); font_desc = pango_font_description_copy (pango_context_get_font_description (context)); if (state->font_family) pango_font_description_set_family_static (font_desc, state->font_family); pango_font_description_set_style (font_desc, state->font_style); pango_font_description_set_variant (font_desc, state->font_variant); pango_font_description_set_weight (font_desc, state->font_weight); pango_font_description_set_stretch (font_desc, state->font_stretch); pango_font_description_set_size (font_desc, _rsvg_css_normalize_font_size (state, ctx) * PANGO_SCALE / ctx->dpi_y * 72); layout = pango_layout_new (context); pango_layout_set_font_description (layout, font_desc); pango_font_description_free (font_desc); attr_list = pango_attr_list_new (); attribute = pango_attr_letter_spacing_new (_rsvg_css_normalize_length (&state->letter_spacing, ctx, 'h') * PANGO_SCALE); attribute->start_index = 0; attribute->end_index = G_MAXINT; pango_attr_list_insert (attr_list, attribute); if (state->has_font_decor && text) { if (state->font_decor & TEXT_UNDERLINE) { attribute = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); attribute->start_index = 0; attribute->end_index = -1; pango_attr_list_insert (attr_list, attribute); } if (state->font_decor & TEXT_STRIKE) { attribute = pango_attr_strikethrough_new (TRUE); attribute->start_index = 0; attribute->end_index = -1; pango_attr_list_insert (attr_list, attribute); } } pango_layout_set_attributes (layout, attr_list); pango_attr_list_unref (attr_list); if (text) pango_layout_set_text (layout, text, -1); else pango_layout_set_text (layout, NULL, 0); pango_layout_set_alignment (layout, (state->text_dir == PANGO_DIRECTION_LTR || state->text_dir == PANGO_DIRECTION_TTB_LTR) ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT); return layout; }
static void configure_term_widget (VteTerminal *vtterm, GVariantDict *options) { /* Pick default settings from the settings... */ dg_lmem gchar *opt_font = NULL; dg_lmem gchar *opt_theme = NULL; dg_lmem gchar *opt_fgcolor = NULL; dg_lmem gchar *opt_bgcolor = NULL; gboolean opt_bold; guint opt_scroll; DwtSettings *settings = dwt_settings_get_instance (); g_object_get (settings, "font", &opt_font, "theme", &opt_theme, "allow-bold", &opt_bold, "scrollback", &opt_scroll, "foreground-color", &opt_fgcolor, "background-color", &opt_bgcolor, NULL); /* * This ensures that properties are updated for the terminal whenever they * change in the configuration files. * * TODO: For now this is done only for those properties which cannot be * overriden using command line flags. */ static const struct { const gchar *setting_name; const gchar *property_name; GBindingFlags bind_flags; } property_bind_map[] = { { "mouse-autohide", "pointer-autohide", G_BINDING_SYNC_CREATE }, { "audible-bell", "audible-bell", G_BINDING_SYNC_CREATE }, }; for (guint i = 0; i < G_N_ELEMENTS (property_bind_map); i++) { g_object_bind_property (settings, property_bind_map[i].setting_name, G_OBJECT (vtterm), property_bind_map[i].property_name, property_bind_map[i].bind_flags); } /* ...and allow command line options to override them. */ if (options) { dg_lmem gchar *cmd_font = NULL; g_variant_dict_lookup (options, "font", "s", &cmd_font); if (cmd_font) SWAP (gchar*, cmd_font, opt_font); dg_lmem gchar *cmd_theme = NULL; g_variant_dict_lookup (options, "theme", "s", &cmd_theme); if (cmd_theme) SWAP (gchar*, cmd_theme, opt_theme); g_variant_dict_lookup (options, "allow-bold", "b", &opt_bold); g_variant_dict_lookup (options, "scrollback", "u", &opt_scroll); } PangoFontDescription *fontd = pango_font_description_from_string (opt_font); if (fontd) { if (!pango_font_description_get_family (fontd)) pango_font_description_set_family_static (fontd, "monospace"); if (!pango_font_description_get_size (fontd)) pango_font_description_set_size (fontd, 12 * PANGO_SCALE); vte_terminal_set_font (vtterm, fontd); pango_font_description_free (fontd); fontd = NULL; } const Theme *theme = &themes[1]; if (opt_theme) { theme = find_theme (opt_theme); if (!theme) { g_printerr ("No such theme '%s', using default (linux)\n", opt_theme); theme = &themes[1]; } } GdkRGBA fgcolor, bgcolor; if (!(opt_fgcolor && gdk_rgba_parse (&fgcolor, opt_fgcolor))) fgcolor = theme->fg; if (!(opt_bgcolor && gdk_rgba_parse (&bgcolor, opt_bgcolor))) bgcolor = theme->bg; vte_terminal_set_rewrap_on_resize (vtterm, TRUE); vte_terminal_set_scroll_on_keystroke (vtterm, TRUE); vte_terminal_set_audible_bell (vtterm, FALSE); vte_terminal_set_scroll_on_output (vtterm, FALSE); vte_terminal_set_allow_bold (vtterm, opt_bold); vte_terminal_set_scrollback_lines (vtterm, opt_scroll); vte_terminal_set_cursor_blink_mode (vtterm, VTE_CURSOR_BLINK_OFF); vte_terminal_set_cursor_shape (vtterm, VTE_CURSOR_SHAPE_BLOCK); vte_terminal_set_colors (vtterm, &fgcolor, &bgcolor, theme->colors, G_N_ELEMENTS (theme->colors)); const GRegexCompileFlags regex_compile_flags = G_REGEX_CASELESS | G_REGEX_OPTIMIZE | G_REGEX_MULTILINE; gint match_tag = vte_terminal_match_add_gregex (vtterm, g_regex_new (uri_regexp, regex_compile_flags, G_REGEX_MATCH_NOTEMPTY, NULL), G_REGEX_MATCH_NOTEMPTY); vte_terminal_match_set_cursor_type (vtterm, match_tag, GDK_HAND2); }
static void conting_cs_draw(ContingDrawing *self, cairo_t *cr) { ContingSymbol *symb; ContingComponent *comp; GdkColor *color; ArtPoint pw0, pw1; GdkRectangle rect; gdouble affine[6]; g_return_if_fail(self != NULL && CONTING_IS_CS(self)); symb = CONTING_SYMBOL(self); comp = CONTING_COMPONENT(self); g_object_get(self, "color", &color, NULL); pw0 = comp->p0; pw1 = comp->p1; rect.x = (pw0.x < pw1.x ? pw0.x : pw1.x); rect.y = (pw0.y < pw1.y ? pw0.y : pw1.y); rect.width = fabs(pw1.x - pw0.x); rect.height = fabs(pw1.y - pw0.y); cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); cairo_arc(cr, rect.x + ((gdouble) rect.width / 2.0), rect.y + ((gdouble) rect.height / 2.0), (gdouble) rect.width / 2.0, 0, 2 * M_PI); cairo_set_source_rgb(cr, (gdouble) color->red / (gdouble) G_MAXUINT16, (gdouble) color->green / (gdouble) G_MAXUINT16, (gdouble) color->blue / (gdouble) G_MAXUINT16); cairo_stroke(cr); cr = conting_drawing_get_cairo_absolute(self); conting_drawing_get_i2w_affine_absolute(self, affine); cairo_transform(cr, (cairo_matrix_t *) affine); cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); cairo_set_source_rgb(cr, (gdouble) color->red / (gdouble) G_MAXUINT16, (gdouble) color->green / (gdouble) G_MAXUINT16, (gdouble) color->blue / (gdouble) G_MAXUINT16); { PangoLayout *layout; PangoFontDescription *font; layout = pango_cairo_create_layout(cr); font = pango_font_description_new(); pango_font_description_set_size(font, 4 * PANGO_SCALE); /* g_print("size = %d\n", pango_font_description_get_size(font)); */ pango_font_description_set_family_static(font, "Arial"); pango_font_description_set_style(font, PANGO_STYLE_NORMAL); pango_layout_set_font_description(layout, font); pango_layout_set_text(layout, "CS", 2); cairo_move_to(cr, pw0.x + 1, pw0.y + 2); pango_cairo_update_layout(cr, layout); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } cairo_stroke(cr); cairo_destroy(cr); CONTING_DRAWING_CLASS(parent_class)->draw(self, cr); }
static PangoCairoFontHexBoxInfo * _pango_cairo_font_private_get_hex_box_info (PangoCairoFontPrivate *cf_priv) { static const char hexdigits[] = "0123456789ABCDEF"; char c[2] = {0, 0}; PangoFont *mini_font; PangoCairoFontHexBoxInfo *hbi; /* for metrics hinting */ double scale_x = 1., scale_x_inv = 1., scale_y = 1., scale_y_inv = 1.; gboolean is_hinted; int i; int rows; double pad; double width = 0; double height = 0; cairo_font_options_t *font_options; cairo_font_extents_t font_extents; double size, mini_size; PangoFontDescription *desc; cairo_scaled_font_t *scaled_font, *scaled_mini_font; PangoMatrix pango_ctm; cairo_matrix_t cairo_ctm; PangoGravity gravity; if (!cf_priv) return NULL; if (cf_priv->hbi) return cf_priv->hbi; scaled_font = _pango_cairo_font_private_get_scaled_font (cf_priv); if (G_UNLIKELY (scaled_font == NULL || cairo_scaled_font_status (scaled_font) != CAIRO_STATUS_SUCCESS)) return NULL; is_hinted = cf_priv->is_hinted; font_options = cairo_font_options_create (); desc = pango_font_describe_with_absolute_size ((PangoFont *)cf_priv->cfont); size = pango_font_description_get_size (desc) / (1.*PANGO_SCALE); gravity = pango_font_description_get_gravity (desc); cairo_scaled_font_get_ctm (scaled_font, &cairo_ctm); cairo_scaled_font_get_font_options (scaled_font, font_options); /* I started adding support for vertical hexboxes here, but it's too much * work. Easier to do with cairo user fonts and vertical writing mode * support in cairo. */ /*cairo_matrix_rotate (&cairo_ctm, pango_gravity_to_rotation (gravity));*/ pango_ctm.xx = cairo_ctm.xx; pango_ctm.yx = cairo_ctm.yx; pango_ctm.xy = cairo_ctm.xy; pango_ctm.yy = cairo_ctm.yy; pango_ctm.x0 = cairo_ctm.x0; pango_ctm.y0 = cairo_ctm.y0; if (is_hinted) { /* prepare for some hinting */ double x, y; x = 1.; y = 0.; cairo_matrix_transform_distance (&cairo_ctm, &x, &y); scale_x = sqrt (x*x + y*y); scale_x_inv = 1 / scale_x; x = 0.; y = 1.; cairo_matrix_transform_distance (&cairo_ctm, &x, &y); scale_y = sqrt (x*x + y*y); scale_y_inv = 1 / scale_y; } /* we hint to the nearest device units */ #define HINT(value, scale, scale_inv) (ceil ((value-1e-5) * scale) * scale_inv) #define HINT_X(value) HINT ((value), scale_x, scale_x_inv) #define HINT_Y(value) HINT ((value), scale_y, scale_y_inv) /* create mini_font description */ { PangoFontMap *fontmap; PangoContext *context; /* XXX this is racy. need a ref'ing getter... */ fontmap = pango_font_get_font_map ((PangoFont *)cf_priv->cfont); if (!fontmap) return NULL; fontmap = g_object_ref (fontmap); /* we inherit most font properties for the mini font. just * change family and size. means, you get bold hex digits * in the hexbox for a bold font. */ /* We should rotate the box, not glyphs */ pango_font_description_unset_fields (desc, PANGO_FONT_MASK_GRAVITY); pango_font_description_set_family_static (desc, "monospace"); rows = 2; mini_size = size / 2.2; if (is_hinted) { mini_size = HINT_Y (mini_size); if (mini_size < 6.0) { rows = 1; mini_size = MIN (MAX (size - 1, 0), 6.0); } } pango_font_description_set_absolute_size (desc, pango_units_from_double (mini_size)); /* load mini_font */ context = pango_font_map_create_context (fontmap); pango_context_set_matrix (context, &pango_ctm); pango_context_set_language (context, pango_script_get_sample_language (PANGO_SCRIPT_LATIN)); pango_cairo_context_set_font_options (context, font_options); mini_font = pango_font_map_load_font (fontmap, context, desc); g_object_unref (context); g_object_unref (fontmap); } pango_font_description_free (desc); cairo_font_options_destroy (font_options); scaled_mini_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *) mini_font); for (i = 0 ; i < 16 ; i++) { cairo_text_extents_t extents; c[0] = hexdigits[i]; cairo_scaled_font_text_extents (scaled_mini_font, c, &extents); width = MAX (width, extents.width); height = MAX (height, extents.height); } cairo_scaled_font_extents (scaled_font, &font_extents); if (font_extents.ascent + font_extents.descent <= 0) { font_extents.ascent = PANGO_UNKNOWN_GLYPH_HEIGHT; font_extents.descent = 0; } pad = (font_extents.ascent + font_extents.descent) / 43; pad = MIN (pad, mini_size); hbi = g_slice_new (PangoCairoFontHexBoxInfo); hbi->font = (PangoCairoFont *) mini_font; hbi->rows = rows; hbi->digit_width = width; hbi->digit_height = height; hbi->pad_x = pad; hbi->pad_y = pad; if (is_hinted) { hbi->digit_width = HINT_X (hbi->digit_width); hbi->digit_height = HINT_Y (hbi->digit_height); hbi->pad_x = HINT_X (hbi->pad_x); hbi->pad_y = HINT_Y (hbi->pad_y); } hbi->line_width = MIN (hbi->pad_x, hbi->pad_y); hbi->box_height = 3 * hbi->pad_y + rows * (hbi->pad_y + hbi->digit_height); if (rows == 1 || hbi->box_height <= font_extents.ascent) { hbi->box_descent = 2 * hbi->pad_y; } else if (hbi->box_height <= font_extents.ascent + font_extents.descent - 2 * hbi->pad_y) { hbi->box_descent = 2 * hbi->pad_y + hbi->box_height - font_extents.ascent; } else { hbi->box_descent = font_extents.descent * hbi->box_height / (font_extents.ascent + font_extents.descent); } if (is_hinted) { hbi->box_descent = HINT_Y (hbi->box_descent); } cf_priv->hbi = hbi; return hbi; }
static void e_table_group_container_print_page (EPrintable *ep, GtkPrintContext *context, gdouble width, gdouble height, gboolean quantize, ETGCPrintContext *groupcontext) { cairo_t *cr; gdouble yd = height; gdouble child_height; ETableGroupContainerChildNode *child_node; GList *child; EPrintable *child_printable; gchar *string; PangoLayout *layout; PangoFontDescription *desc; child_printable = groupcontext->child_printable; child = groupcontext->child; yd = 6.5 * 72; height = 5 * 72; if (child_printable) { if (child) child_node = child->data; else child_node = NULL; g_object_ref (child_printable); } else { if (!child) { return; } else { child_node = child->data; child_printable = e_table_group_get_printable(child_node->child); if (child_printable) g_object_ref (child_printable); e_printable_reset(child_printable); } } layout = gtk_print_context_create_pango_layout (context); desc = pango_font_description_new (); pango_font_description_set_family_static (desc, "Helvetica"); pango_font_description_set_size (desc, TEXT_HEIGHT); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); while (1) { child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize); cr = gtk_print_context_get_cairo_context (context); cairo_save (cr); cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT); cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT); cairo_set_source_rgb (cr, .7, .7, .7) ; cairo_fill(cr) ; cairo_restore (cr); cairo_save (cr); cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT); cairo_clip (cr); cairo_restore (cr); cairo_move_to(cr, 0, 0); if (groupcontext->etgc->ecol->text) string = g_strdup_printf ("%s : %s (%d item%s)", groupcontext->etgc->ecol->text, child_node->string, (gint) child_node->count, child_node->count == 1 ? "" : "s"); else string = g_strdup_printf ("%s (%d item%s)", child_node->string, (gint) child_node->count, child_node->count == 1 ? "" : "s"); pango_layout_set_text (layout, string, -1); pango_cairo_show_layout (cr, layout); g_free(string); cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ; cairo_move_to(cr, 0, 0); cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height); cairo_clip(cr); e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize); yd += child_height + TEXT_AREA_HEIGHT; if (e_printable_data_left(child_printable)) break; child = child->next; if (!child) { child_printable = NULL; break; } child_node = child->data; if (child_printable) g_object_unref (child_printable); child_printable = e_table_group_get_printable(child_node->child); if (child_printable) g_object_ref (child_printable); e_printable_reset(child_printable); } if (groupcontext->child_printable) g_object_unref (groupcontext->child_printable); groupcontext->child_printable = child_printable; groupcontext->child = child; g_object_unref (layout); }