Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: KACHORRO en 13 de Noviembre de 2002, 11:41:18 AM

Título: Un getpixel en DirectDraw 7
Publicado por: KACHORRO en 13 de Noviembre de 2002, 11:41:18 AM
                                He implementado un getpixel para leer el color de un pixel dentro de una surface siguiendo el siguiente código:

unsigned char* videoMemory;
long pitch;

void lock()
{
   DDSURFACEDESC2 ddsd;
   ddsd.dwSize = sizeof(ddsd);
   back->Lock(0, &ddsd, DDLOCK_WAIT, 0);
   videoMemory = (unsigned char*)ddsd.lpSurface;
   pitch = ddsd.lPitch;
}

void unlock()
{back->Unlock(0);}

int getPixel(int x, int y)
{return(videoMemory[x + pitch * y]);}


  Aunque todo es correcto y compila, no funciona bien. No sé si puede ser debido al formato de color o a que no me coloco en el pixel correcto dentro de la surface... no sé, el caso es que tengo muchas dudas con el mapeado de memoria de una surface en función de su profundidad de color. Estoy usando un modo gráfico de 800x600x16 bits y las surfaces son creadas a partir de BMP's de 24bits.

  Gracias por adelantado por vuestra colaboración.                                
Título: Un getpixel en DirectDraw 7
Publicado por: KACHORRO en 13 de Noviembre de 2002, 11:46:42 AM
                                Se me olvidó retocar el codigo para indicar que el puntero a memoria que tengo no es unsigned char como aparece en el código, si no que es int. También he probado con unsigned int sin éxito.                                
Título: GetPixel en DDraw 7
Publicado por: AK47 en 13 de Noviembre de 2002, 06:55:34 PM
                                Una cosa, y no quiero insultar tu inteligencia, pero haces el GetPixel entre el Lock y el UnLock? Porque sino no funciona :|
A ver si te vale ;)                                
Título: Ya está solucionado
Publicado por: KACHORRO en 13 de Noviembre de 2002, 07:13:55 PM
                                Lo del unlock y el lock ... ¬¬

  No obstante, después de muchas investigaciones, pruebas visuales, cuelgues de windows... resulta que:

-Dado que uso un modo de 16 bits, el tipo de dato a apuntar videoMemory es WORD (o eso he creido yo)

Y ahora viene lo mejor... por arte de magia, por probar, por ya no saber que hacer, divido el dsdd.lPitch entre 2... y funciona.  :P

No tengo ni idea de por qué, y la verdad, no me importa. Después de dos días probando cosas, me conformo con la máxima de la programación (al menos para mi)  "SI FUNCIONA, ESTÁ BIEN"                                
Título: Un getpixel en DirectDraw 7
Publicado por: fiero en 13 de Noviembre de 2002, 07:31:23 PM
                                Deberias poner:

int getPixel(int x, int y)
{return(videoMemory[x * bytesPorPixel + pitch * y]);}

si estás usando un modo de 16 bits, entonces bytesPorPixel=2

un saludo                                
Título: Un getpixel en DirectDraw 7
Publicado por: fiero en 13 de Noviembre de 2002, 10:41:01 PM
                                Me picaba la curiosidad y lo he probado. Me extrañaba que te funcionase, a mi no me funciona tal como lo tienes, me devuelve un solo byte del color. Yo lo haria de la siguiente manera, para que devuelva un valor de 16 bits:

int getPixel(int x, int y)
{return(*(WORD*)(videoMemory + x*2 + pitch*y));}

un saludo