S�ll !
Thanks a lot
I replace all my area.modify_font_desc by layout.set_font_description
This is indeed much less expensive and everything works smoothly now !
Kv.
JB
On Mon, 15 Dec 2003 11:49:55 -0300
alejandro david weil <[EMAIL PROTECTED]> wrote:
> Ey!
> I'm going to write this fast, 'cause i must go to work right now, but, asking if i'm
> not
> clear, so I could rewrite whatever..
>
> You don't know to switch the font for a DrawingArea! :-)
>
> (Well.. one thing: i'm not an gtk-expert, I only wrote my fishs and
> experimented with gtk, but i'm not sure of ALL ok?)
>
> I mean, you must create a layout when you think in rendering some text.
>
> For example, you want to create labels? Well.. the labels should be pixmaps.
> But, in the constructor of the labels (or in other place, before use them), you
> create a pango_layout and then render the text with the choosen font to a
> pixmap, and then use the pixmap. After that, you use the pixmap that's fast!
> So, then you have a pixmap for any label with the font desired for any label.
>
> Then, if you want to change the font for some label, you may write a method,
> to change the font, that re-builds the label(pixmap).
>
> Mmh.. I'll expect to be.. readble.. you know, my english is poor.
> Spanish is my language, please, ask whatever you want!
> Alejandro
>
> Nice screenshot!
>
>
> On Mon December 15 2003 07:23, you wrote:
> > S�l Alejandro
> >
> > Thanks for your indications. It seems like a nice work around the problem.
> > But it is quite heavy when I consider to draw potentially hundreds of this
> > labels. You deserve more explanation to understand my problem:
> > I want to have at least 2 fonts on the same drawing area because I am
> > drawing a graph with many labels on X-Y axis. In order to make them visible
> > I allow the user to chose their font (especially the size). At the same
> > time The user can choose the font for the legend, titles,etc... (see
> > picture)
> >
> > Now that I figured out where the problem is coming from, one solution for
> > me would be to have more than 1 drawing area. But in general it would be
> > useful to have more than 1 font available in a DrawingArea without needing
> > to save all the pixmaps explicitly
> >
> > Any easy way to do so ?
> >
> >
> > Thanks
> >
> > Jean-Baptiste
> >
> > On Fri, 12 Dec 2003 20:51:40 +0300
> >
> > "Alejandro David Weil" <[EMAIL PROTECTED]> wrote:
> > > Hi!
> > >
> > > I'm not sure what's your problem but I had have one of your problems:
> > >
> > > The create_pango_layout is not supposed to be called all the time..
> > > For that, my class caches the layout:
> > >
> > > class Message:
> > > def __init__(self, msg):
> > > """ We are expecting unicode message strings """
> > > self.msg = msg.encode('utf-8')
> > > # create a font description
> > > self.font_desc = pango.FontDescription('Serif 8')
> > >
> > > def _make_layout (self, widget):
> > > global wrapmode, wrapwidth
> > > # create a layout for your drawing area
> > > self.layout = widget.create_pango_layout(self.msg)
> > > self.layout.set_wrap(wrapmode)
> > > self.layout.set_width(wrapwidth)
> > > # tell the layout which font description to use
> > > self.layout.set_font_description(self.font_desc)
> > >
> > > def _make_cache(self, gc):
> > > """ This method doesn't seems to be fundamental, but.. """
> > > global depth
> > > #self.image = string.join(self.mx*3*self.my*['\0'],"")
> > > #self.image = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, self.mx,
> > > self.my) self.image = gtk.gdk.Pixmap(None, self.mx, self.my, depth)
> > >
> > > self.gc = gc
> > > colormap = gc.get_colormap()
> > > white = colormap.alloc_color('white')
> > > yellow = colormap.alloc_color('yellow')
> > > black = colormap.alloc_color('black')
> > >
> > > gc.set_rgb_fg_color (yellow)
> > > self.image.draw_rectangle(gc, gtk.TRUE, 0,0, self.mx-1, self.my-1)
> > > gc.set_rgb_fg_color (black)
> > > self.image.draw_rectangle(gc, gtk.FALSE,0,0, self.mx-1, self.my-1)
> > > gc.set_rgb_fg_color (black)
> > >
> > > # draw the text with the draw_layout method
> > > self.image.draw_layout(self.gc, Message.BORDER_SIZE,
> > > Message.BORDER_SIZE, self.layout)
> > >
> > > def drawon(self, atx, aty, widget=None, gc=None):
> > > if not self.widget:
> > > if not widget or not gc:
> > > return
> > > else:
> > > self._make_layout(widget)
> > > self.widget = widget
> > > self._make_cache(gc)
> > >
> > > # draw the text with the draw_layout method
> > > #widget.window.draw_layout(gc, atx, aty, self.layout)
> > > #self.image.render_to_drawable (widget.window, gc, 0, 0, atx,aty,
> > > self.mx, self.my, gtk.gdk.RGB_DITHER_MAX, 0, 0)
> > > widget.window.draw_drawable(self.gc, self.image, 0, 0, atx, aty, self.mx,
> > > self.my)
> > >
> > >
> > > This creates the layout and dumps it, with a frame into a pixmap that's
> > > later used to be draw anytime.
> > >
> > > I removed some code, but that should be enough.
> > > It's from the class Message of IMFish(.sourceforge.net) :-)
> > >
> > > Also, i think that you should setup what font do you want
> > > to use, in other place, than the expose-cb!
> > >
> > > Seeya!
> > >
> > > -----Original Message-----
> > > From: Jean-Baptiste Cazier <[EMAIL PROTECTED]>
> > > To: "Gustavo J. A. M. Carneiro" <[EMAIL PROTECTED]>
> > > Date: Fri, 12 Dec 2003 17:38:46 +0000
> > > Subject: Re: [pygtk] High CPU problem example
> > >
> > > >Hello Gustavo !
> > > >
> > > >Thanks for your answer.
> > > >Your solution works fine for my simplified problem. It also pin-point
> > > > the source of my troubles. But in order to solve my original problem I
> > > > need a further tip: Indeed If I actually draw something based on the
> > > > modified font by adding the line area.window.draw_layout(self.gc, 10,
> > > > 10, self.area.create_pango_layout("TEXT")) Nothing is drawn at all if
> > > > moved to the area_realize_cb routine.
> > > >
> > > >In my real area_expose_cb routine I draw many things with various fonts
> > > > that are set-up in other windows For example I call draw_axes_s which
> > > > uses 2 types of fonts.
> > > >
> > > > def draw_axes_s(self, xo, yo, xs, ys ):
> > > > """ Draw axis and write down the labels on the screen"""
> > > >
> > > > win=self.area.window
> > > > mini=self.Cld.mini
> > > > maxi=self.Cld.maxi
> > > > mindist=self.Cld.mindist
> > > > markers=self.Cld.markers
> > > > location=self.Cld.location
> > > > f_mrkX=markers[0][0]
> > > > l_mrkX=markers[0][len(markers[0])-1]
> > > > f_mrkY=markers[1][0]
> > > > l_mrkY=markers[1][len(markers[1])-1]
> > > >
> > > > xsize=min(max(float(xs)/(maxi[0]-mini[0])*mindist[0]*.9,self.min_size),
> > > >self.max_size)
> > > > ysize=min(max(float(ys)/(maxi[1]-mini[1])*mindist[1]*.9,self.min_size),
> > > >self.max_size) # Draw the lines
> > > > self.gc.foreground =self.area.get_colormap().alloc_color("black")
> > > > win.draw_line(self.gc, xo, yo, xo+xs, yo)
> > > > win.draw_line(self.gc, xo, yo, xo, yo-ys)
> > > > #Draw ticks
> > > > for m in markers[0]:
> > > > col=(location[0][m]-mini[0])/(maxi[0]-mini[0])
> > > > win.draw_line(self.gc, xsize/2+xo+col*(xs-xsize),
> > > > yo,xsize/2+xo+col*(xs-xsize),yo+3 ) for m in markers[1]:
> > > > col=(location[1][m]-mini[1])/(maxi[1]-mini[1])
> > > > win.draw_line(self.gc, xo,-ysize/2+yo-col*(ys-ysize), xo-3,
> > > > -ysize/2+yo-col*(ys-ysize) )
> > > > font_desc=pango.FontDescription(self.lab_font)
> > > > <------
> > > > self.area.modify_font(font_desc)
> > > > <------
> > > >
> > > ># write the labels
> > > > win.draw_layout(self.gc, xo+xs/2, yo+self.Yoffset*3/4,
> > > > self.lay(self.Xlabel)) win.draw_layout(self.gc, xo-60,
> > > > yo-ys-30,self.lay(self.Ylabel))
> > > > font_desc=pango.FontDescription(self.mrk_font)
> > > > <-------
> > > > self.area.modify_font(font_desc)
> > > > <-------
> > > >
> > > > ....
> > > >
> > > >
> > > >Moving this call to a realize emission that does not draw any axis at
> > > > all
> > > >
> > > >So am I using pango or realize/expose_event the wrong way ?
> > > >Any help will be appreciated
> > > >
> > > >
> > > >regards.
> > > >
> > > >Jean-Baptiste
>
> --
> + There is no dark side of the moon really. Matter of fact it's all dark.
>
--
-----------------------------
[EMAIL PROTECTED]
Department of Statistics
deCODE genetics Sturlugata,8
570 2993 101 Reykjav�k
_______________________________________________
pygtk mailing list [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/