मैं मार्कअप पार्सर के स्रोत के माध्यम से किया गया है और यह "आकार" के लिए अनुमति नहीं है जिम्मेदार बताते हैं (वैसे Pango लगभग ग्राफिक्स को शामिल करता है) लेकिन इसे "हाथ से" करना संभव है।
के बाद से वहाँ वेब पर बिल्कुल कोई उदाहरण कोड है, यहाँ Pango/काहिरा है/छवियाँ 101.
एक सरल डेमो के लिए, मैं एक 800x400 खिड़की बनाया है, एक GtkDrawingArea जोड़ा गया है और "आकर्षित" संकेत अप जुड़ा हुआ है। मुख्य कार्यक्रम पाश प्रवेश करने से पहले, मैं इसे निम्न कोड के साथ प्रारंभ:
PangoLayout *Pango;
void init_drawingArea (GtkWidget *pWidget)
{
cairo_surface_t *pImg = cairo_image_surface_create_from_png ("linux.png");
PangoRectangle r = {0, 0, PANGO_SCALE * cairo_image_surface_get_width (pImg),
PANGO_SCALE * cairo_image_surface_get_height(pImg)};
PangoContext *ctxt = gtk_widget_get_pango_context (pWidget);
PangoAttrList *attList = pango_attr_list_new();
PangoAttribute *attr;
Pango = pango_layout_new (ctxt);
pango_cairo_context_set_shape_renderer (ctxt, render, NULL, NULL);
pango_layout_set_text (Pango, pszLorem, -1);
pango_layout_set_width(Pango, PANGO_SCALE * 800);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 0; attr->end_index = 1;
pango_attr_list_insert (attList, attr);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 152; attr->end_index = 153;
pango_attr_list_insert (attList, attr);
pango_layout_set_attributes (Pango, attList);
}
संदर्भ के आकार रेंडरर() रेंडर करने के लिए सेट कर दिया जाता है और एक PangoLayout बनाया है और आरंभ नहीं हो जाता। इसके बाद यह 2 आकार विशेषताओं को बनाता है, उपयोगकर्ता डेटा को कैरो सतह पर सेट करता है जिसे हम एक पीएनजी फ़ाइल से पॉप्युलेट करते हैं और टेक्स्ट के अक्षर 0 और 152 में गुण लागू करते हैं।
"ड्रॉ" सिग्नल प्रोसेसिंग सरल है।
gboolean onDraw (GtkWidget *pWidget, cairo_t *cr, gpointer user_data)
{
pango_cairo_show_layout (cr, Pango);
return 1;
}
और रेंडर() PangoCairoShapeRenderFunc समारोह के रूप में की जरूरत है कहा जाता है:
void render (cairo_t *cr, PangoAttrShape *pShape, gboolean do_path, gpointer data)
{
cairo_surface_t *img = (cairo_surface_t *)pShape->data;
double dx, dy;
cairo_get_current_point(cr, &dx, &dy);
cairo_set_source_surface(cr, img, dx, dy);
cairo_rectangle (cr, dx, dy, pShape->ink_rect.width/PANGO_SCALE,
pShape->ink_rect.height/PANGO_SCALE);
cairo_fill(cr);
}
काहिरा से वर्तमान बिंदु ले रहा है तो यह एक आयत आकर्षित करता है और छवि के साथ भरता है।
और यह काफी कुछ है। छवियों को बाद में विचार के रूप में जोड़ा गया था और यह दिखाता है। वे किसी भी अन्य ग्लिफ के समान नियमों के अधीन हैं, इसलिए वे सीएसएस के प्रदर्शन के बराबर तक सीमित हैं: इनलाइन।
यदि कोई इसके साथ खेलना चाहता है तो मैंने कोड को http://immortalsofar.com/PangoDemo/ पर रखा है। मैं, मैं यहाँ GtkTextBuffer की सीमाओं को पाने की कोशिश कर रहा था। मान लीजिए मुझे गहरा जाना होगा।
संक्षिप्त अनुमान: आप इसमें सबसे पहले हैं।पेंगो एक पूर्ण एचटीएमएल रेंडरर नहीं है - बस एक टेक्स्ट लेआउट इंजन। लेकिन फिर भी एक अच्छी तरह से सवाल रखा - शायद किसी ने पहले वहां पीछे हटना पड़ा था। – jsbueno