[gnome-hispano] pygtk cairo drawing



Buenos dias, esta es mi primera incursion en esta lista. Tengo algunas
dudas de programacion con python gtk, gstreamer y cairo.

Estoy escribiendo una aplicacion "para musicos" llamada "Python Live
Studio". Me he ayudado en el codigo de Jokosher, vi que extienden
gtk.DrawingArea para graficar los decibeles de una pista de audio.
Necesito hacer lo mismo.

Me gustaria hacerlo de manera mas eficiente (lease, no re-generar el
grafico cada vez que ocurre un evento "expose"). Algun hint para esto?
El codigo actual es el siguiente: una vez cargado el stream con pipes
de gstreamer, realizo el grafico utilizando pycairo (sin necesidad de
algun widget asociado a X11) y lo guardo en un archivo .png dentro del
directorio del proyecto. El problema que tengo es que no puedo generar
graficos de mas de cierto ancho (width) creo que sobre 40000 pixels:
genera un png transaparente sin datos ni nada.

El extracto de codigo es el siguiente:

import gtk
import cairo
import gst
from Constants import *

class WaveWidget(gtk.Image):
    [...]

    def _drawWave(self):
        [...]

        # paint title for audio
        if self.audiotrack == None:
            title = "Drag Audio track here..."
        else:
            title = self.audiotrack.name
        context.set_source_rgb(*self._TEXT_RGB)
        context.move_to(5, 15)
        context.show_text(title)

        # paint audio levels
        if self.audiotrack != None:
            wave_path, exists =
self.mainapp.resources.get_cache_audiotrack_wave_path(self.audiotrack)
            # only draw if it isn't cached
            if not exists:
                self.mainapp.tell(self,
TELL_AUDIOTRACK_WAVE_GENERATING, "Generating audiotrack wave: %s" %
self.audiotrack.name)
                length = len(self.audiotrack.levels)
                xstep = 1.0 * self.width/length

                i = 0
                x = -1
                context.move_to(0, self.height)
                for peak in self.audiotrack.levels:
                    nx = int(i * xstep)
                    if nx != x:
                        peaklevel = self.height - int(peak * self.height)
                        context.line_to(nx, peaklevel)
                        x = nx
                    i += 1

                gradient = cairo.LinearGradient(0.0, 0.0, 0, self.height)
                gradient.add_color_stop_rgba(*self._OPAQUE_GRADIENT_STOP_ORGBA)

gradient.add_color_stop_rgba(*self._TRANSPARENT_GRADIENT_STOP_ORGBA)
                context.set_source(gradient)
                context.fill_preserve()

                context.set_source_rgb(*self._BORDER_RGB)
                context.set_line_join(cairo.LINE_JOIN_ROUND)
                context.set_line_width(self._LINE_WIDTH)
                context.stroke()

                print "Writing to cache %s" % wave_path
                surface.write_to_png(wave_path)
            self.mainapp.tell(self, TELL_AUDIOTRACK_WAVE_LOADED,
"Audiotrack: %s" % self.audiotrack.name)
        else:
            wave_path = "/tmp/data.png"
            surface.write_to_png(wave_path)

        # load image from (cached) file...
        self.set_from_file(wave_path)

"Siento" que es mucho mas rapido que Jokosher, ya que el grafico se
genera en un archivo y se carga en memoria, por lo que no hay que
redibujar cada vez que ocurre un evento expose. Algun hint o tip para
mejorar esto?


Ademas, me gustaria que recomendaran algun hosting para el proyecto
(pagina web, svn, listas de correo, etc) para proyectos gnome (ya
tengo cuenta en sourceforge, pero me parece que hay mejores lugares y
me gustaria escuchar que estan usando).


Muchas gracias y felices fiestas!

-- 
Aldrin Martoq



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]