+static void fill_pixbuf_with_outline( GdkPixbuf* pixbuf, FT_Bitmap* bitmap, int w, int h, int pad, int align, rgba_color fg, rgba_color bg, rgba_color ol, int outline )
+{
+ int stride = gdk_pixbuf_get_rowstride( pixbuf );
+ int x = ( gdk_pixbuf_get_width( pixbuf ) - w - 2 * pad ) * align / 2 + pad;
+ uint8_t* dest = gdk_pixbuf_get_pixels( pixbuf ) + 4 * x + pad * stride;
+ int j ,i;
+ uint8_t *d = NULL;
+ float a_ol = 0;
+ float a_fg = 0;
+
+ for ( j = 0; j < h; j++ )
+ {
+ d = dest;
+ for ( i = 0; i < w; i++ )
+ {
+#define geta(x, y) (float) bitmap->buffer[ (y) * bitmap->pitch + (x) ] / 255.0
+
+ a_ol = geta(i, j);
+ // One pixel fake circle
+ if ( i > 0 )
+ a_ol = MAX( a_ol, geta(i - 1, j) );
+ if ( i < w - 1 )
+ a_ol = MAX( a_ol, geta(i + 1, j) );
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i, j - 1) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i, j + 1) );
+ if ( outline >= 2 ) {
+ // Two pixels fake circle
+ if ( i > 1 ) {
+ a_ol = MAX( a_ol, geta(i - 2, j) );
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i - 2, j - 1) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i - 2, j + 1) );
+ }
+ if ( i > 0 ) {
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i - 1, j - 1) );
+ if ( j > 1 )
+ a_ol = MAX( a_ol, geta(i - 1, j - 2) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i - 1, j + 1) );
+ if ( j < h - 2 )
+ a_ol = MAX( a_ol, geta(i - 1, j + 2) );
+ }
+ if ( j > 1 )
+ a_ol = MAX( a_ol, geta(i, j - 2) );
+ if ( j < h - 2 )
+ a_ol = MAX( a_ol, geta(i, j + 2) );
+ if ( i < w - 1 ) {
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i + 1, j - 1) );
+ if ( j > 1 )
+ a_ol = MAX( a_ol, geta(i + 1, j - 2) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i + 1, j + 1) );
+ if ( j < h - 2 )
+ a_ol = MAX( a_ol, geta(i + 1, j + 2) );
+ }
+ if ( i < w - 2 ) {
+ a_ol = MAX( a_ol, geta(i + 2, j) );
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i + 2, j - 1) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i + 2, j + 1) );
+ }
+ }
+ if ( outline >= 3 ) {
+ // Three pixels fake circle
+ if ( i > 2 ) {
+ a_ol = MAX( a_ol, geta(i - 3, j) );
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i - 3, j - 1) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i - 3, j + 1) );
+ }
+ if ( i > 1 ) {
+ if ( j > 1 )
+ a_ol = MAX( a_ol, geta(i - 2, j - 2) );
+ if ( j < h - 2 )
+ a_ol = MAX( a_ol, geta(i - 2, j + 2) );
+ }
+ if ( i > 0 ) {
+ if ( j > 2 )
+ a_ol = MAX( a_ol, geta(i - 1, j - 3) );
+ if ( j < h - 3 )
+ a_ol = MAX( a_ol, geta(i - 1, j + 3) );
+ }
+ if ( j > 2 )
+ a_ol = MAX( a_ol, geta(i, j - 3) );
+ if ( j < h - 3 )
+ a_ol = MAX( a_ol, geta(i, j + 3) );
+ if ( i < w - 1 ) {
+ if ( j > 2 )
+ a_ol = MAX( a_ol, geta(i + 1, j - 3) );
+ if ( j < h - 3 )
+ a_ol = MAX( a_ol, geta(i + 1, j + 3) );
+ }
+ if ( i < w - 2 ) {
+ if ( j > 1 )
+ a_ol = MAX( a_ol, geta(i + 2, j - 2) );
+ if ( j < h - 2 )
+ a_ol = MAX( a_ol, geta(i + 2, j + 2) );
+ }
+ if ( i < w - 3 ) {
+ a_ol = MAX( a_ol, geta(i + 3, j) );
+ if ( j > 0 )
+ a_ol = MAX( a_ol, geta(i + 3, j - 1) );
+ if ( j < h - 1 )
+ a_ol = MAX( a_ol, geta(i + 3, j + 1) );
+ }
+ }
+
+ a_fg = ( float ) bitmap->buffer[ j * bitmap->pitch + i ] / 255.0;
+
+ *d++ = ( int ) ( a_fg * fg.r + ( 1 - a_fg ) * ( a_ol * ol.r + ( 1 - a_ol ) * bg.r ) );
+ *d++ = ( int ) ( a_fg * fg.g + ( 1 - a_fg ) * ( a_ol * ol.g + ( 1 - a_ol ) * bg.g ) );
+ *d++ = ( int ) ( a_fg * fg.b + ( 1 - a_fg ) * ( a_ol * ol.b + ( 1 - a_ol ) * bg.b ) );
+ *d++ = ( int ) ( a_fg * fg.a + ( 1 - a_fg ) * ( a_ol * ol.a + ( 1 - a_ol ) * bg.a ) );
+ }
+ dest += stride;
+ }