Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Un getpixel en DirectDraw 7

Iniciado por KACHORRO, 13 de Noviembre de 2002, 11:41:18 AM

« anterior - próximo »

KACHORRO

                                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.                                

KACHORRO

                                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.                                

AK47

                                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 ;)                                

KACHORRO

                                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"                                

fiero

                                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                                
www.videopanoramas.com Videopanoramas 3D player

fiero

                                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                                
www.videopanoramas.com Videopanoramas 3D player






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.