Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: StraT en 29 de Junio de 2007, 03:55:13 PM

Título: Problema con transparencia C#+Tao.Sdl+Tao.SDLttf
Publicado por: StraT en 29 de Junio de 2007, 03:55:13 PM
Hola a todos, a ver si me podéis echar una mano (al cuello no :P).

Estoy intentando implementar una clase en C# para pintar texto en pantalla, con el siguiente codigo:

using System;
using System.Collections.Generic;
using System.Text;
using Tao.Sdl;

namespace SSE
{
   class SSE2DText
   {
       public static void drawText(String text, String fontname, int size, int colorR,
           int colorG, int colorB, short x, short y, byte trans)
       {
           SdlTtf.TTF_Init();
           IntPtr font = SdlTtf.TTF_OpenFont(fontname, size);
           if (font == IntPtr.Zero)
           {
               Logger.getInstance().writeError("Error al cargar la fuente");
               Logger.getInstance().closeLog();
           }
           Sdl.SDL_Color fgcolor = new Sdl.SDL_Color((byte)colorR, (byte)colorG,
               (byte)colorB, trans);
           IntPtr buffer = SdlTtf.TTF_RenderText_Blended(font, text, fgcolor);
           IntPtr textSurface = Sdl.SDL_DisplayFormatAlpha(buffer);
           Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);

           SSE.draw(textSurface, x, y);
       }
       public static void drawText(String text, String fontname, int size, int colorR,
           int colorG, int colorB, short x, short y)
       {
           drawText(text, fontname, size, colorR, colorG, colorB, x, y, 255);
       }
   }
}


SSE.draw(img, x, y) hace un blitSurface a la pantalla y poco más.

Compila y funciona todo perfectamente exepto la transparencia, que por motivos que no acabo de entender, no funciona. Alguien sabe algo al respecto? Gracias, :)
Título: Problema con transparencia C#+Tao.Sdl+Tao.SDLttf
Publicado por: StraT en 02 de Julio de 2007, 01:32:26 PM
¿Nadie?  :oops:
Título: Problema con transparencia C#+Tao.Sdl+Tao.SDLttf
Publicado por: TheAzazel en 03 de Julio de 2007, 12:55:32 AM
Buenas!

No he utilizado el modulo TTF pero mirando un poco, creo que al hacer el rendertext ya te devuelve una surface con el alpha activado y me parece que con:

IntPtr textSurface = Sdl.SDL_DisplayFormatAlpha(buffer);
Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);

te lo estas cargando...la prueba rapida es quitar esas dos lineas y si ves que funciona va bien la cosa. Si eso funciona aun podrias perder rendimiento por estar en distinto formato... pero ahora puedes probar a no activar el alpha con setalpha PORQUE eso tambien se carga el alpha per-pixel.

SDL soporta alpha per-surface(se activa con el SetAlpha() y se aplica a toda la surface por igual) o per-pixel(cada pixel tiene su componente alpha independiente) pero estos dos tipos no se pueden mezclar y si mal no recuerdo, el per-surface se carga al per-pixel.

Dime si te funciono...

Por cierto, no se como ira esto de SDL sobre C# pero hay tienes 2 memory leaks gordos... a no ser que lo libere el solito pero no lo creo...
Saludos!
Título: Problema con transparencia C#+Tao.Sdl+Tao.SDLttf
Publicado por: StraT en 04 de Julio de 2007, 12:01:29 AM
No funciona tampoco quitando esas dos lineas... Ahora el código que tengo es este:

SdlTtf.TTF_Init();
           IntPtr font = SdlTtf.TTF_OpenFont(fontname, size);
           if (font == IntPtr.Zero)
           {
               Logger.getInstance().writeError("Error al cargar la fuente");
               Logger.getInstance().closeLog();
           }
           Sdl.SDL_Color fgcolor = new Sdl.SDL_Color((byte)colorR, (byte)colorG,
               (byte)colorB, trans);
           IntPtr textSurface = SdlTtf.TTF_RenderText_Blended(font, text, fgcolor);
           Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);

           SSE.draw(textSurface, x, y);


Saludos y gracias!