2016-06-27 19 views
1

ich an einem Projekt arbeite, die die folgende Technik verwendet, um Text zu machen:Pango Farbe Glyphen

  • Freetype - Glyph-Mapping
  • Pango - Text Layout
  • Skia - Zeichnung (Schriftfarbe und Grafiken für Rest des Systems)

Wir versuchen nun, die Fähigkeit einzufügen, farbige Emoji zu rendern. Gerade jetzt scheint es, dass Freetype die Unterstützung hinzugefügt hat, um Farbglyphen zu spezifizieren, aber wir haben Probleme bekommen, Pango zu Layout-farbigen Schriften zu bekommen. Ist es überhaupt möglich Emoji auf diese Weise zu rendern? Wenn wir von Skia nach Kairo wechseln würden, würde das helfen?

In ähnlicher Weise habe ich dieses kleine Beispiel https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html genommen und versucht, Emoji anstelle von Text zu verwenden, und ich bekomme nicht die Glyphe zu zeigen, obwohl die Schriftart "Apple Color Emoji" angegeben ist.

#include <math.h> 
#include <pango/pangocairo.h> 
#include <cairo.h> 

static void 
draw_text (cairo_t *cr) 
{ 
#define RADIUS 150 
#define N_WORDS 10 
#define FONT "Apple Color Emoji" 

    PangoLayout *layout; 
    PangoFontDescription *desc; 
    int i; 

    /* Center coordinates on the middle of the region we are drawing 
    */ 
    cairo_translate (cr, RADIUS, RADIUS); 

    /* Create a PangoLayout, set the font and text */ 
    layout = pango_cairo_create_layout (cr); 

    pango_layout_set_text (layout, "", -1); 
    desc = pango_font_description_from_string (FONT); 
    pango_layout_set_font_description (layout, desc); 
    pango_font_description_free (desc); 

    /* Draw the layout N_WORDS times in a circle */ 
    for (i = 0; i < N_WORDS; i++) 
    { 
     int width, height; 
     double angle = (360. * i)/N_WORDS; 
     double red; 

     cairo_save (cr); 

     /* Gradient from red at angle == 60 to blue at angle == 240 */ 
     red = (1 + cos ((angle - 60) * G_PI/180.))/2; 
     cairo_set_source_rgb (cr, red, 0, 1.0 - red); 

     cairo_rotate (cr, angle * G_PI/180.); 

     /* Inform Pango to re-layout the text with the new transformation */ 
     pango_cairo_update_layout (cr, layout); 

     pango_layout_get_size (layout, &width, &height); 
     cairo_move_to (cr, - ((double)width/PANGO_SCALE)/2, - RADIUS); 
     pango_cairo_show_layout (cr, layout); 

     cairo_restore (cr); 
    } 

    /* free the layout object */ 
    g_object_unref (layout); 
} 

int main (int argc, char **argv) 
{ 
    cairo_t *cr; 
    char *filename; 
    cairo_status_t status; 
    cairo_surface_t *surface; 


    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 
             2 * RADIUS, 2 * RADIUS); 
    cr = cairo_create (surface); 

    cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); 
    cairo_paint (cr); 
    draw_text (cr); 
    cairo_destroy (cr); 

    status = cairo_surface_write_to_png (surface, "/home/mikeobrien/emojiRendering/TESTFILE"); 
    cairo_surface_destroy (surface); 

    if (status != CAIRO_STATUS_SUCCESS) 
    { 
     g_printerr ("Could not save png to '%s'\n", "/home/mikeobrien/emojiRendering/TESTFILE"); 
     return 1; 
    } 


    return 0; 
} 

Yeilds this

+0

Sieht eher nach einem Font-Rendering-Problem aus. – oldtechaa

+1

Sind Sie sicher, dass es sogar die Schriftart verwendet? – oldtechaa

+0

Wenigstens unterstützt cairo keine farbigen Glyphen. Das Konzept passt nicht in sein Zeichnungsmodell (z. B. was passiert, wenn Sie eine solche Glyphe mit einer roten Quelle zeichnen und Operator XOR?). –

Antwort

1

Sie müssen möglicherweise mit Noto Farbe Emoji versuchen. FreeType unterstützt den Farb-Emoji-Standard von Apple nicht.

+1

Diese Antwort gehört wirklich als Kommentar. Mir ist klar, dass Sie nicht für Kommentare verantwortlich sind, und dies gibt einen Hinweis auf eine mögliche Lösung. Ich werde diese Antwort wahrscheinlich bearbeiten, damit sie besser zu den Antwortrichtlinien passt. Danke fürs Beitreten. – oldtechaa