Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con transparencia C#+Tao.Sdl+Tao.SDLttf

Iniciado por StraT, 29 de Junio de 2007, 03:55:13 PM

« anterior - próximo »

StraT

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, :)
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

StraT

quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

TheAzazel

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!

StraT

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!
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.