示例#1
0
static void
xftfont_close (struct font *font)
{
  struct x_display_info *xdi;
  struct xftfont_info *xftfont_info = (struct xftfont_info *) font;

#ifdef HAVE_LIBOTF
  if (xftfont_info->otf)
    {
      OTF_close (xftfont_info->otf);
      xftfont_info->otf = NULL;
    }
#endif

  /* See comment in xfont_close.  */
  if (xftfont_info->xftfont
      && ((xdi = x_display_info_for_display (xftfont_info->display))
	  && xftfont_info->x_display_id == xdi->x_id))
    {
      block_input ();
      XftUnlockFace (xftfont_info->xftfont);
      XftFontClose (xftfont_info->display, xftfont_info->xftfont);
      unblock_input ();
      xftfont_info->xftfont = NULL;
    }
}
示例#2
0
文件: text_xft.c 项目: burzumishi/e16
static void
_xft_Unload(TextState * ts)
{
   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;

   XftFontClose(disp, fdc->font);
}
示例#3
0
bool x86UNIXFont::create(const char *name, U32 size, U32 charset)
{
  Display *display = XOpenDisplay(getenv("DISPLAY"));
  if (display == NULL)
    AssertFatal(false, "createFont: cannot connect to X server");

  XftFont *font = loadFont(name, size, display);
  
  if (!font)
  {
    Con::errorf("Error: Could not load font -%s-", name);
    return false;
  }
  char xfontname[1024];
  XftNameUnparse(font->pattern, xfontname, 1024);
#ifdef DEBUG
  Con::printf("CreateFont: request for %s %d, using %s", name, size, xfontname);
#endif
  // store some info about the font
  baseline = font->ascent;
  height = font->height;
  mFontName = StringTable->insert(xfontname);
  XftFontClose (display, font);
  // DISPLAY
  XCloseDisplay(display);

  return true;
}
示例#4
0
void
xaw_destroy_instance (widget_instance *instance)
{
#ifdef HAVE_XFT
    if (instance->xft_data)
    {
        int i;
        for (i = 0; i < instance->nr_xft_data; ++i)
        {
            if (instance->xft_data[i].xft_draw)
                XftDrawDestroy (instance->xft_data[i].xft_draw);
            if (instance->xft_data[i].p != None)
            {
                XtVaSetValues (instance->xft_data[i].widget, XtNbitmap, None,
                               NULL);
                XFreePixmap (XtDisplay (instance->widget),
                             instance->xft_data[i].p);
            }
        }
        if (instance->xft_data[0].xft_font)
            XftFontClose (XtDisplay (instance->widget),
                          instance->xft_data[0].xft_font);
        xfree (instance->xft_data);
    }
#endif
    if (XtIsSubclass (instance->widget, dialogWidgetClass))
        /* Need to destroy the Shell too. */
        XtDestroyWidget (XtParent (instance->widget));
    else
        XtDestroyWidget (instance->widget);
}
示例#5
0
文件: tooltip.c 项目: mozeq/skippy-xd
void
tooltip_destroy(Tooltip *tt)
{
	if(tt->text)
		free(tt->text);
	if(tt->font)
		XftFontClose(tt->mainwin->dpy, tt->font);
	if(tt->draw)
		XftDrawDestroy(tt->draw);
	if(tt->color.pixel != None)
		XftColorFree(tt->mainwin->dpy,
		             tt->mainwin->visual,
		             tt->mainwin->colormap,
		             &tt->color);
	if(tt->background.pixel != None)
		XftColorFree(tt->mainwin->dpy,
		             tt->mainwin->visual,
		             tt->mainwin->colormap,
		             &tt->background);
	if(tt->border.pixel != None)
		XftColorFree(tt->mainwin->dpy,
		             tt->mainwin->visual,
		             tt->mainwin->colormap,
		             &tt->border);
	if(tt->shadow.pixel != None)
		XftColorFree(tt->mainwin->dpy,
		             tt->mainwin->visual,
		             tt->mainwin->colormap,
		             &tt->shadow);
	if(tt->window != None)
		XDestroyWindow(tt->mainwin->dpy, tt->window);
	
	free(tt);
}
示例#6
0
文件: window.c 项目: muennich/sxiv
int win_draw_text(win_t *win, XftDraw *d, const XftColor *color, int x, int y,
                  char *text, int len, int w)
{
	int err, tw = 0;
	char *t, *next;
	uint32_t rune;
	XftFont *f;
	FcCharSet *fccharset;
	XGlyphInfo ext;

	for (t = text; t - text < len; t = next) {
		next = utf8_decode(t, &rune, &err);
		if (XftCharExists(win->env.dpy, font, rune)) {
			f = font;
		} else { /* fallback font */
			fccharset = FcCharSetCreate();
			FcCharSetAddChar(fccharset, rune);
			f = XftFontOpen(win->env.dpy, win->env.scr, FC_CHARSET, FcTypeCharSet,
			                fccharset, FC_SCALABLE, FcTypeBool, FcTrue,
			                FC_SIZE, FcTypeDouble, fontsize, NULL);
			FcCharSetDestroy(fccharset);
		}
		XftTextExtentsUtf8(win->env.dpy, f, (XftChar8*)t, next - t, &ext);
		tw += ext.xOff;
		if (tw <= w) {
			XftDrawStringUtf8(d, color, f, x, y, (XftChar8*)t, next - t);
			x += ext.xOff;
		}
		if (f != font)
			XftFontClose(win->env.dpy, f);
	}
	return tw;
}
示例#7
0
Error FontX11::load(const String& p_name,float p_size,unsigned int p_flags) {
	
	if (font) {
		XftFontInfoDestroy( x11_display, font_info );
		XftFontClose( x11_display, font );
		
		font=NULL;
	}	

	name="";
	size=0;
	flags=0;
	
	font = XftFontOpen (x11_display, DefaultScreen(x11_display),XFT_FAMILY, XftTypeString, p_name.utf8().get_data(),
		                    XFT_SIZE, XftTypeDouble, p_size,NULL);	
		
	if (!font) {
		
		return ERR_UNSUPPORTED;
	}
	
	font_info = XftFontInfoCreate( x11_display, font->pattern );

	flags=p_flags;
	name=p_name;
	size=p_size;
	return OK;
}
示例#8
0
文件: drw.c 项目: Cornu/dwm
void
drw_font_free(Display *dpy, Fnt *font) {
	if(!font)
		return;
	XftFontClose(dpy, font->xfont);
	free(font);
}
示例#9
0
static void
FinishedWithFont(
    UnixFtFont *fontPtr)
{
    Display *display = fontPtr->display;
    int i;
    Tk_ErrorHandler handler = Tk_CreateErrorHandler(display, -1, -1, -1, NULL,
	    (ClientData) NULL);

    for (i = 0; i < fontPtr->nfaces; i++) {
	if (fontPtr->faces[i].ftFont) {
	    XftFontClose(fontPtr->display, fontPtr->faces[i].ftFont);
	}
	if (fontPtr->faces[i].charset) {
	    FcCharSetDestroy(fontPtr->faces[i].charset);
	}
    }
    if (fontPtr->faces) {
	ckfree((char *)fontPtr->faces);
    }
    if (fontPtr->pattern) {
	FcPatternDestroy(fontPtr->pattern);
    }
    if (fontPtr->ftDraw) {
	XftDrawDestroy(fontPtr->ftDraw);
    }
    if (fontPtr->font.fid) {
	XUnloadFont(fontPtr->display, fontPtr->font.fid);
    }
    if (fontPtr->fontset) {
	FcFontSetDestroy(fontPtr->fontset);
    }
    Tk_DeleteErrorHandler(handler);
}
示例#10
0
// set an Xft font by name
void textbox_font(textbox *tb, char *font, char *fg, char *bg)
{
	if (tb->font) XftFontClose(display, tb->font);
	tb->font = XftFontOpenName(display, DefaultScreen(display), font);

	XftColorAllocName(display, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)), fg, &tb->color_fg);
	XftColorAllocName(display, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)), bg, &tb->color_bg);
}
示例#11
0
文件: font.cpp 项目: Chun-Feng/pcmanx
void CFont::CloseXftFont( XftFont* font )
{
	if( font )
	{
		Display *display = gdk_x11_get_default_xdisplay();
		XftFontClose(display, font );
	}
}
示例#12
0
FontX11::~FontX11() {
	
	if (font) {
		XftFontInfoDestroy( x11_display, font_info );
		XftFontClose( x11_display, font );
	}
		
}
示例#13
0
文件: drw.c 项目: Dean4Devil/dwm
void drw_font_free(Fnt *font)
{
	if (!font)
		return;
	if (font->pattern)
		FcPatternDestroy(font->pattern);
	XftFontClose(font->dpy, font->xfont);
	free(font);
}
示例#14
0
文件: draw.c 项目: dylex/dzen
void
setfont(const char *fontstr) {
#ifndef DZEN_XFT
	char *def, **missing;
	int i, n;

	missing = NULL;
	if(dzen.font.set)
		XFreeFontSet(dzen.dpy, dzen.font.set);

	dzen.font.set = XCreateFontSet(dzen.dpy, fontstr, &missing, &n, &def);
	if(missing)
		XFreeStringList(missing);

	if(dzen.font.set) {
		XFontSetExtents *font_extents;
		XFontStruct **xfonts;
		char **font_names;
		dzen.font.ascent = dzen.font.descent = 0;
		font_extents = XExtentsOfFontSet(dzen.font.set);
		n = XFontsOfFontSet(dzen.font.set, &xfonts, &font_names);
		for(i = 0, dzen.font.ascent = 0, dzen.font.descent = 0; i < n; i++) {
			if(dzen.font.ascent < (*xfonts)->ascent)
				dzen.font.ascent = (*xfonts)->ascent;
			if(dzen.font.descent < (*xfonts)->descent)
				dzen.font.descent = (*xfonts)->descent;
			xfonts++;
		}
	}
	else {
		if(dzen.font.xfont)
			XFreeFont(dzen.dpy, dzen.font.xfont);
		dzen.font.xfont = NULL;
		if(!(dzen.font.xfont = XLoadQueryFont(dzen.dpy, fontstr)))
			eprint("dzen: error, cannot load font: '%s'\n", fontstr);
		dzen.font.ascent = dzen.font.xfont->ascent;
		dzen.font.descent = dzen.font.xfont->descent;
	}
	dzen.font.height = dzen.font.ascent + dzen.font.descent;
#else
        if(dzen.font.xftfont)
           XftFontClose(dzen.dpy, dzen.font.xftfont);
	dzen.font.xftfont = XftFontOpenXlfd(dzen.dpy, dzen.screen, fontstr);
	if(!dzen.font.xftfont)
	   dzen.font.xftfont = XftFontOpenName(dzen.dpy, dzen.screen, fontstr);
	if(!dzen.font.xftfont)
	   eprint("error, cannot load font: '%s'\n", fontstr);
	dzen.font.extents = malloc(sizeof(XGlyphInfo));
	XftTextExtentsUtf8(dzen.dpy, dzen.font.xftfont, (unsigned const char *) fontstr, strlen(fontstr), dzen.font.extents);
	dzen.font.height = dzen.font.xftfont->ascent + dzen.font.xftfont->descent;
	dzen.font.width = (dzen.font.extents->width)/strlen(fontstr);
#endif
}
示例#15
0
文件: drw.c 项目: Dean4Devil/dwm
/* This function is an implementation detail. Library users should use
 * drw_font_create instead.
 */
static Fnt * drw_font_xcreate(Drw *drw, const char *fontname, FcPattern *fontpattern)
{
	Fnt *font;

	if (!(fontname || fontpattern))
		die("No font specified.\n");

	if (!(font = (Fnt *)calloc(1, sizeof(Fnt))))
		return NULL;

	if (fontname)
	{
		/* Using the pattern found at font->xfont->pattern does not yield same
		 * the same substitution results as using the pattern returned by
		 * FcNameParse; using the latter results in the desired fallback
		 * behaviour whereas the former just results in
		 * missing-character-rectangles being drawn, at least with some fonts.
		 */
		if (!(font->xfont = XftFontOpenName(drw->dpy, drw->screen, fontname)) ||
		    !(font->pattern = FcNameParse((FcChar8 *) fontname)))
		{
			if (font->xfont)
			{
				XftFontClose(drw->dpy, font->xfont);
				font->xfont = NULL;
			}
			fprintf(stderr, "error, cannot load font: '%s'\n", fontname);
		}
	}
	else if (fontpattern)
	{
		if (!(font->xfont = XftFontOpenPattern(drw->dpy, fontpattern)))
		{
			fprintf(stderr, "error, cannot load font pattern.\n");
		} else {
			font->pattern = NULL;
		}
	}

	if (!font->xfont)
	{
		free(font);
		return NULL;
	}

	font->ascent = font->xfont->ascent;
	font->descent = font->xfont->descent;
	font->h = font->ascent + font->descent;
	font->dpy = drw->dpy;
	return font;
}
示例#16
0
文件: xftfont.c 项目: Sunmonds/emacs
static void
xftfont_close (FRAME_PTR f, struct font *font)
{
  struct xftfont_info *xftfont_info = (struct xftfont_info *) font;

#ifdef HAVE_LIBOTF
  if (xftfont_info->otf)
    OTF_close (xftfont_info->otf);
#endif
  BLOCK_INPUT;
  XftUnlockFace (xftfont_info->xftfont);
  XftFontClose (xftfont_info->display, xftfont_info->xftfont);
  UNBLOCK_INPUT;
}
示例#17
0
void
WMReleaseFont(WMFont *font)
{
    wassertr(font!=NULL);

    font->refCount--;
    if (font->refCount < 1) {
        XftFontClose(font->screen->display, font->font);
        if (font->name) {
            WMHashRemove(font->screen->fontCache, font->name);
            wfree(font->name);
        }
        wfree(font);
    }
}
示例#18
0
// will also unmap the window if still displayed
void textbox_free(textbox *tb)
{
	if (tb->flags & TB_EDITABLE)
	{
		XDestroyIC(tb->xic);
		XCloseIM(tb->xim);
	}

	if (tb->text) free(tb->text);
	if (tb->prompt) free(tb->prompt);
	if (tb->font) XftFontClose(display, tb->font);

	XDestroyWindow(display, tb->window);
	free(tb);
}
示例#19
0
文件: Menu.C 项目: bbidulock/wmx
void Menu::cleanup(WindowManager *const wm)
{
    if (m_initialised) { // fix due to Eric Marsden
#ifdef CONFIG_USE_XFT
	XftFontClose(wm->display(), m_font);
#endif
        for (int i = 0; i < wm->screensTotal(); i++) {
#ifdef CONFIG_USE_XFT
	    XftDrawDestroy(m_xftDraw[i]);
#else
	    XFreeFontSet(wm->display(), m_fontset);
#endif
	    XFreeGC(wm->display(), m_menuGC[i]);
	}
    }
}
示例#20
0
void
JXFontManager::XFont::Free
	(
	JXDisplay* display
	)
{
	if (type == kStdType)
	{
		XFreeFont(*display, xfstd);
	}
	else
	{
		assert( type == kTrueType );
		XftFontClose(*display, xftrue);
	}
}
示例#21
0
文件: x11.c 项目: cbdevnet/xecho
bool x11_blocks_resize(XRESOURCES* xres, CFG* config, TEXTBLOCK** blocks, XGlyphInfo* bounding_box, double size){
	XftFont* font = NULL;
	unsigned bounding_width = 0, bounding_height = 0;
	unsigned i;

	//load font with at supplied size
	font=XftFontOpen(xres->display, xres->screen,
			XFT_FAMILY, XftTypeString, config->font_name,
			XFT_PIXEL_SIZE, XftTypeDouble, size,
			NULL
	);

	if(!font){
		fprintf(stderr, "Could not load font\n");
		return false;
	}

	//fprintf(stderr, "Block \"%s\" extents: width %d, height %d, x %d, y %d, xOff %d, yOff %d\n",
	//		block->text, block->extents.width, block->extents.height, block->extents.x, block->extents.y,
	//		block->extents.xOff, block->extents.yOff);

	//bounds calculation
	for(i = 0; blocks[i] && blocks[i]->active; i++){
		//update only not yet calculated blocks
		if(!(blocks[i]->calculated)){
			XftTextExtentsUtf8(xres->display, font, (FcChar8*)blocks[i]->text, strlen(blocks[i]->text), &(blocks[i]->extents));
			errlog(config, LOG_DEBUG, "Recalculated block %d (%s) extents: %dx%d\n", i, blocks[i]->text, blocks[i]->extents.width, blocks[i]->extents.height);
			blocks[i]->size = size;
		}

		//calculate bounding box over all
		bounding_height += blocks[i]->extents.height;
		if(blocks[i]->extents.width > bounding_width){
			bounding_width = blocks[i]->extents.width;
		}
	}

	if(bounding_box){
		bounding_box->width = bounding_width;
		bounding_box->height = bounding_height;
	}

	XftFontClose(xres->display, font);
	return true;
}
示例#22
0
JXFontManager::~JXFontManager()
{
	const JSize count = itsFontList->GetElementCount();
	for (JIndex i=1; i<=count; i++)
		{
		FontInfo info = itsFontList->GetElement(i);
		delete info.name;
#ifdef _J_USE_XFT
		XftFontClose(*itsDisplay, info.xftfont);
#else
		XFreeFont(*itsDisplay, info.xfont);
#endif
		}
	delete itsFontList;

	delete itsAllFontNames;
	delete itsMonoFontNames;
}
示例#23
0
文件: xresource.c 项目: dct/xvnkb
/*----------------------------------------------------------------------------*/
void VKFreeXResource()
{
	XFreeCursor(display, vk_hand);
	XFreeCursor(display, vk_cursor);
#ifdef USE_XFT
	XftColorFree(display, visual, colormap, &clRed);
	XftColorFree(display, visual, colormap, &clYellow);
	XftColorFree(display, visual, colormap, &clWhite);
	XftColorFree(display, visual, colormap, &clBlack);
	XftColorFree(display, visual, colormap, &clBlue);
	XftColorFree(display, visual, colormap, &clGray);
	XftColorFree(display, visual, colormap, &clMenuBar);
	XftFontClose(display, vk_font);
#else
	XFreeFontSet(display, vk_fontset);
	XFreeFont(display, vk_font);
#endif
}
示例#24
0
文件: draw.c 项目: losciamano/dunst
void freedc(DC * dc)
{
        if (dc->font.xft_font) {
                XftFontClose(dc->dpy, dc->font.xft_font);
                XftDrawDestroy(dc->xftdraw);
        }
        if (dc->font.set)
                XFreeFontSet(dc->dpy, dc->font.set);
        if (dc->font.xfont)
                XFreeFont(dc->dpy, dc->font.xfont);
        if (dc->canvas)
                XFreePixmap(dc->dpy, dc->canvas);
        if (dc->gc)
                XFreeGC(dc->dpy, dc->gc);
        if (dc->dpy)
                XCloseDisplay(dc->dpy);
        if (dc)
                free(dc);
}
示例#25
0
文件: Ctrl.c 项目: xtforever/xtcw
static void Change_Font(Widget w, int n, char *s)
{
  CtrlWidget cw = (CtrlWidget)w;
  CtrlPart *c = & cw->ctrl;
  Display *dpy = XtDisplay(w);
  clabel_t *cl = c->clabel+n;
  XftFont *font;
  TF();
  TRACE(2,"%s",s);

  if( IsEmpty(s) ) s="Sans-12";
  font = XftFontOpenName(dpy, DefaultScreen(dpy), s );
  if(!font ) 
    XtAppError(XtWidgetToApplicationContext(w), "CtrlWidget: unknown font" );
  else {
    if( cl->font ) XftFontClose( dpy, cl->font);
    cl->font = font;
  }
}
示例#26
0
文件: font.c 项目: shokre/notion
void de_free_font(DEFont *font)
{
    if(--font->refcount!=0)
        return;

#ifdef HAVE_X11_XFT
    if(font->font!=NULL)
        XftFontClose(ioncore_g.dpy, font->font);
#else /* HAVE_X11_XFT */
    if(font->fontset!=NULL)
        XFreeFontSet(ioncore_g.dpy, font->fontset);
    if(font->fontstruct!=NULL)
        XFreeFont(ioncore_g.dpy, font->fontstruct);
#endif /* HAVE_X11_XFT */
    if(font->pattern!=NULL)
        free(font->pattern);

    UNLINK_ITEM(fonts, font, next, prev);
    free(font);
}
示例#27
0
static void gui_init_xft(void)
{
    int i;

    /* 釋放原有的字型 */
    if (gui->xftfonts)
    {
	for (i=0 ; i < gui->num_fonts ; i++)
	{
	    XftFontClose(gui->display, gui->xftfonts[i]);
	}
	free(gui->xftfonts);
    }
    gui->num_fonts = 0;
    gui->xftfonts = NULL;

    /* 釋放缺字表 */
    if (gui->missing_chars)
    {
	FcCharSetDestroy(gui->missing_chars);
    }
    gui->missing_chars = FcCharSetCreate();

    /* */
    for (i = 0 ; i < MAX_COLORS ; i++)
    {
	XftColorFree(gui->display, gui->visual, gui->colormap, &gui->colors[i]);

	XftColorAllocName(gui->display, gui->visual, gui->colormap,
	oxim_get_config(colors[i].key_id), &gui->colors[colors[i].color_idx]);
    }

    /* 紀錄預設字型大小 */
    unsigned int default_fontsize = atoi(oxim_get_config(DefaultFontSize));

    if (default_fontsize < 12 || default_fontsize > 48)
	default_fontsize = 16;

    gui->default_fontsize = default_fontsize;

}
示例#28
0
void
freedc(DC *dc) {
  if(dc->info) {
    XFree(dc->info);
  }
  if(dc->font.xft_font)
    XftFontClose(dc->dpy, dc->font.xft_font);
  if(dc->font.set)
    XFreeFontSet(dc->dpy, dc->font.set);
  if(dc->font.xfont)
    XFreeFont(dc->dpy, dc->font.xfont);
  if(dc->menus){
    for(int i=0; i<dc->scrcount; ++i){
      freemenu(dc, &dc->menus[i]);
    }
    free(dc->menus);
  }
  if(dc->gc)
    XFreeGC(dc->dpy, dc->gc);
  if(dc->dpy)
    XCloseDisplay(dc->dpy);
  if(dc)
    free(dc);
}
示例#29
0
文件: Ctrl.c 项目: xtforever/xtcw
static void destroy(Widget w)
{
  int i;
  CtrlPart *c = & ((CtrlWidget)w)->ctrl;
  Display *dpy = XtDisplay(w);
  clabel_t *cl;
  TF();
  if(! c->draw ) return; 

  XftDrawDestroy( c->draw ); c->draw =0; 
  for(i=0;i<3;i++) {  
    XftColorFree(dpy, DefaultVisual(dpy, DefaultScreen(dpy)), None, c->col+i );
    XtReleaseGC( w, c->gc[i] ); c->gc[i] =0;
  }

  for(i=0;i<MAX_CLABEL;i++) {
    cl = c->clabel+i;

    if( cl->font ) { 
      XftFontClose(dpy, cl->font ); cl->font = 0; 
    }

  }
}
static void setup_font_sample(GtkWidget* darea, Antialiasing antialiasing, Hinting hinting)
{
	const char* string1 = "abcfgop AO ";
	const char* string2 = "abcfgop";

	XftColor black, white;
	XRenderColor rendcolor;

	Display* xdisplay = gdk_x11_get_default_xdisplay();

#if GTK_CHECK_VERSION (3, 0, 0)
	Colormap xcolormap = DefaultColormap(xdisplay, 0);
#else
	GdkColormap* colormap = gdk_rgb_get_colormap();
	Colormap xcolormap = GDK_COLORMAP_XCOLORMAP(colormap);
#endif

#if GTK_CHECK_VERSION (3, 0, 0)
	GdkVisual* visual = gdk_visual_get_system ();
#else
	GdkVisual* visual = gdk_colormap_get_visual(colormap);
#endif
	Visual* xvisual = GDK_VISUAL_XVISUAL(visual);

	FcPattern* pattern;
	XftFont* font1;
	XftFont* font2;
	XGlyphInfo extents1 = { 0 };
	XGlyphInfo extents2 = { 0 };
#if !GTK_CHECK_VERSION (3, 0, 0)
	GdkPixmap* pixmap;
#endif
	XftDraw* draw;
	GdkPixbuf* tmp_pixbuf;
	GdkPixbuf* pixbuf;

	int width, height;
	int ascent, descent;

	pattern = FcPatternBuild (NULL,
		FC_FAMILY, FcTypeString, "Serif",
		FC_SLANT, FcTypeInteger, FC_SLANT_ROMAN,
		FC_SIZE, FcTypeDouble, 18.,
		NULL);
	font1 = open_pattern (pattern, antialiasing, hinting);
	FcPatternDestroy (pattern);

	pattern = FcPatternBuild (NULL,
		FC_FAMILY, FcTypeString, "Serif",
		FC_SLANT, FcTypeInteger, FC_SLANT_ITALIC,
		FC_SIZE, FcTypeDouble, 20.,
		NULL);
	font2 = open_pattern (pattern, antialiasing, hinting);
	FcPatternDestroy (pattern);

	ascent = 0;
	descent = 0;
	
	if (font1)
	{
		XftTextExtentsUtf8 (xdisplay, font1, (unsigned char*) string1,
		strlen (string1), &extents1);
		ascent = MAX (ascent, font1->ascent);
		descent = MAX (descent, font1->descent);
	}

	if (font2)
	{
		XftTextExtentsUtf8 (xdisplay, font2, (unsigned char*) string2, strlen (string2), &extents2);
		ascent = MAX (ascent, font2->ascent);
		descent = MAX (descent, font2->descent);
	}

	width = extents1.xOff + extents2.xOff + 4;
	height = ascent + descent + 2;

#if !GTK_CHECK_VERSION (3, 0, 0)
	pixmap = gdk_pixmap_new (NULL, width, height, visual->depth);
#endif

#if GTK_CHECK_VERSION (3, 0, 0)
	draw = XftDrawCreate (xdisplay, GDK_WINDOW_XID (gdk_screen_get_root_window (gdk_screen_get_default ())), xvisual, xcolormap);
#else
	draw = XftDrawCreate (xdisplay, GDK_DRAWABLE_XID (pixmap), xvisual, xcolormap);
#endif

	rendcolor.red = 0;
	rendcolor.green = 0;
	rendcolor.blue = 0;
	rendcolor.alpha = 0xffff;
	
	XftColorAllocValue(xdisplay, xvisual, xcolormap, &rendcolor, &black);

	rendcolor.red = 0xffff;
	rendcolor.green = 0xffff;
	rendcolor.blue = 0xffff;
	rendcolor.alpha = 0xffff;
	
	XftColorAllocValue(xdisplay, xvisual, xcolormap, &rendcolor, &white);
	XftDrawRect(draw, &white, 0, 0, width, height);
	
	if (font1)
	{
		XftDrawStringUtf8(draw, &black, font1, 2, 2 + ascent, (unsigned char*) string1, strlen(string1));
	}
	
	if (font2)
	{
		XftDrawStringUtf8(draw, &black, font2, 2 + extents1.xOff, 2 + ascent, (unsigned char*) string2, strlen(string2));
	}

	XftDrawDestroy(draw);

	if (font1)
	{
		XftFontClose(xdisplay, font1);
	}
	
	if (font2)
	{
		XftFontClose(xdisplay, font2);
	}

#if GTK_CHECK_VERSION (3, 0, 0)
	tmp_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE,8, width, height);
#else
	tmp_pixbuf = gdk_pixbuf_get_from_drawable(NULL, pixmap, colormap, 0, 0, 0, 0, width, height);
#endif
	pixbuf = gdk_pixbuf_scale_simple(tmp_pixbuf, 1 * width, 1 * height, GDK_INTERP_TILES);

#if !GTK_CHECK_VERSION (3, 0, 0)
	g_object_unref(pixmap);
#endif
	g_object_unref(tmp_pixbuf);

	g_object_set_data_full(G_OBJECT(darea), "sample-pixbuf", pixbuf, (GDestroyNotify) g_object_unref);

#if GTK_CHECK_VERSION (3, 0, 0)
	gtk_widget_set_size_request  (GTK_WIDGET(darea), width + 2, height + 2);
	g_signal_connect(darea, "draw", G_CALLBACK(sample_draw), NULL);
#else
	g_signal_connect(darea, "size_request", G_CALLBACK(sample_size_request), NULL);
	g_signal_connect(darea, "expose_event", G_CALLBACK(sample_expose), NULL);
#endif
}