2016-06-27 1 views
1

Je travaille sur un projet qui utilise la technologie suivante pour rendre le texte:Pango Couleur Glyphes

  • Freetype - cartographie Glyphe
  • Pango - Mise en page de texte
  • Skia - Dessin (couleur de la police et des graphiques pour reste du système)

Nous essayons maintenant d'ajouter la possibilité de rendre des emoji colorés. À l'heure actuelle, il semble que Freetype a ajouté le support pour spécifier des glyphes de couleur, mais nous avons eu des problèmes pour mettre Pango à disposition des polices de couleur. Est-il même possible de rendre les emoji de cette façon? Si nous passions de Skia au Caire, cela aiderait-il?

De même, j'ai pris ce petit exemple https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html et essayé d'utiliser emoji au lieu de texte et je ne reçois pas le glyphe pour montrer même si la police spécifiée est "Apple Color Emoji".

#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

Cela ressemble plus à un problème de rendu de police. – oldtechaa

+1

Etes-vous sûr que c'est même en utilisant la police? – oldtechaa

+0

Au moins cairo ne supporte pas les glyphes colorés. Le concept ne rentre pas dans son modèle de dessin (par exemple ce qui est supposé se produire lorsque vous dessinez un tel glyphe avec une source rouge et l'opérateur XOR?). –

Répondre

1

Vous devrez peut-être essayer d'utiliser Noto Couleur Emoji. FreeType ne prend pas en charge la norme emoji de couleur d'Apple.

+1

Cette réponse fait vraiment partie d'un commentaire. Je me rends compte que vous n'avez pas le représentant pour les commentaires, cependant, et cela donne une idée d'une solution possible. Je vais probablement modifier cette réponse pour mieux l'adapter aux directives de réponse. Merci d'être venu. – oldtechaa