<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;"><div id="yiv1072795899"><table cellspacing="0" cellpadding="0" border="0" id="yiv1072795899bodyDrftID" class="yiv1072795899"><tbody><tr><td id="yiv1072795899drftMsgContent" style="font:inherit;font-family:arial;font-size:10pt;"><div id="yiv1072795899"><table cellspacing="0" cellpadding="0" border="0" id="yiv1072795899bodyDrftID" class="yiv1072795899"><tbody><tr><td id="yiv1072795899drftMsgContent" style="font:inherit;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif" style="font-family:arial;font-size:10pt;">H</font><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif" style="font-size:10pt;">ola, buenas a todos, estoy siguiendo el tutorial de SDL: </font><div><div style="text-align:center;font-size:10pt;"><b><font class="yiv1072795899Apple-style-span" face="'lucida console',
 sans-serif">Tutorial de libSDL para la programación de</font></b></div><div style="text-align:center;font-size:10pt;"><b><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">videojuegos</font></b></div><div style="text-align:center;font-size:10pt;"><b><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">Antonio García Alba</font></b></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">Y me he encontrado con varias incógnitas, pero antes les explico mi entorno:</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">Ubuntu 10.10 32 bits</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console',
 sans-serif">IDE: NetBeans 6.9 con g++ para compilar las aplicaciones.</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">Procesador Intel -> Little-endian.</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">El objetivo de esta aplicación es seleccionar un pixel de una superficie y cambiarle el color, aunque el código no lo puse completo para no extender excesivamente el correo, si alguien lo necesita, me lo indica y con mucho gusto se lo envío en un archivo comprimido.</font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">El código funciona
 correctamente y hace lo que se pide, por ese lado no hay problema.</font></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" color="#0000FF">enum colores {R,G,B}</font></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">void PutPixel(SDL_Surface *superficie, int x, int y, Uint32 pixel)</font></div><div style="font-size:10pt;"><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">{</font></div><div><font class="yiv1072795899Apple-style-span"
 size="2" color="#0000FF" face="'lucida console', sans-serif">    //Obtener la profundidad del
 color...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    int bpp = superficie->format->BytesPerPixel;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    //Obtener la posición
 del píxel a sustituir...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    Uint8 *p = (Uint8 *)superficie->pixels + y * superficie->pitch + x * bpp;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    //Según sea la profundidad de color...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    switch (bpp)</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    {</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console',
 sans-serif">        case 1: //8 bits (256
 colores)...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            *p = pixel;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            break;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">        case 2: //16 bits (65536 colores o HighColor)...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            *(Uint16 *)p = pixel;</font></div><div><font class="yiv1072795899Apple-style-span" size="2"
 color="#0000FF" face="'lucida console', sans-serif">      
      break;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">        case 3: //24 bits (True Color)...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            {</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                //Calcular cada uno de los componentes del
 color...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                //3 Bytes, 3 posiciones...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                p[R] = (pixel >> 16) & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                p[G] = (pixel >>  8) & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                p[B] = pixel & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF"
 face="'lucida console', sans-serif">            }</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            else</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            {</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                p[R] = pixel & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">                p[G] = (pixel >>  8) & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida
 console', sans-serif">                p[B] = (pixel >> 16) & 0xFF;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            }</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            break;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">        case 4: //32 bits (True color + Alpha)...</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">          
  *(Uint32 *)p = pixel;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">            break;</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">    }</font></div><div><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif">}</font></div></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">Esta función cuenta con la siguiente definición <font class="yiv1072795899Apple-style-span" color="#0000FF">Uint8 *p</font></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida
 console', sans-serif">Esto quiere decir que el puntero "p" de 4 bytes o 32 bits va a apuntar, de momento, a variables que sean de tipo Uint8 de 1 byte  o 8 bits de tamaño, hasta aquí estamos claros.</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console',
 sans-serif">Mi primera pregunta es:</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif">¿Cómo se interpreta la siguiente sentencia?: <font class="yiv1072795899Apple-style-span" color="#FF007F">*</font>(Uint16 *)p = pixel.</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif">La primera parte lo entiendo, si el sistema trabaja con una profundidad de color de 16 bits o 2 bytes entonces se hace un cast a *p para que apunte a variables del tipo Uint16 y así *p en vez de usar un byte o 8 bits para apuntar a el valor, ahora podrá apuntar a variables de</font><span class="yiv1072795899Apple-style-span" style="font-family:sans-serif;font-size:small;"> 2 bytes o 16 bits, pero qué pasa con el otro operador de indirección "</span><span class="yiv1072795899Apple-style-span"
 style="font-family:sans-serif;font-size:small;"><font class="yiv1072795899Apple-style-span" color="#FF007F">*</font></span><span class="yiv1072795899Apple-style-span" style="font-family:sans-serif;font-size:small;">" el que está de rojo, </span><span class="yiv1072795899Apple-style-span" style="font-family:sans-serif;font-size:small;"><b><font class="yiv1072795899Apple-style-span" color="#FF007F">*</font></b></span><span class="yiv1072795899Apple-style-span" style="font-family:sans-serif;font-size:small;">(Uint16 *)p, no entiendo a que apunta aquí.</span></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console',
 sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif">Mi segunda pregunta es sobre el siguiente bloque:</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif"><br></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2"><div style="font-size:medium;"><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF">p[R] = pixel & 0xFF;</font></div><div style="font-size:medium;"><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF">p[G] = (pixel >>  8) & 0xFF;</font></div><div style="font-size:medium;"><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF">p[B] = (pixel >> 16) & 0xFF;</font></div><div style="font-size:medium;"><font
 class="yiv1072795899Apple-style-span" size="2" color="#0000FF"><br></font></div><div style="font-size:medium;"><font class="yiv1072795899Apple-style-span" size="2">Tratándose de punteros, sé que se pueden hacer cosas como esa, pero cómo sabe el compilador que p[1] y p[2], (p[G] y p[B] respectivamente) no están ocupadas con información de otra aplicación, no es esto peligroso?, manipular direcciones de memoria que no se han declarado? </font></div><div style="font-size:medium;"><font class="yiv1072795899Apple-style-span" size="2">Sé que declare *p, pero no declaré p[1], ni p[2], ni p[..n].</font></div><div style="font-size:10pt;">p[R], p[G], p[B], son de 32 bits o 4 bytes cada uno? O p[R], p[G], p[B] representa cada uno un byte de los 4 que tiene p. Me explico con un esquema:</div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF"><br></font></div><div><font class="yiv1072795899Apple-style-span"><font
 class="yiv1072795899Apple-style-span" size="2">Recordemos que *p es de 4 bytes y para el caso de profundidad de color de 24 bits no se ha realizado </font>ningún<font class="yiv1072795899Apple-style-span" size="2"> casting a *p.</font></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF">        
 [------0------]  [------1------]  [------2------]   [-----3------]</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF">[*p-]= </font><font class="yiv1072795899Apple-style-span" color="#FF007F">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - </font><font class="yiv1072795899Apple-style-span" color="#00FF80">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - 0000 0000 - </font>0000 0000<span class="yiv1072795899Apple-style-span" style="color:rgb(0, 0, 255);"> --> 4 bytes o 32 bits.</span></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF">             RED        GREEN        BLUE    -  SIN USO</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span"
 color="#0000FF">p[R]= </font><font class="yiv1072795899Apple-style-span" color="#FF007F">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - </font><font class="yiv1072795899Apple-style-span" color="#00FF80">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - 0000 0000 - </font>0000 0000<span class="yiv1072795899Apple-style-span" style="color:rgb(0, 0, 255);"> --> 4 bytes o 32 bits.</span></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF">p[G]= </font><font class="yiv1072795899Apple-style-span" color="#FF007F">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - </font><font class="yiv1072795899Apple-style-span" color="#00FF80">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - 0000 0000 - </font>0000 0000 <span
 class="yiv1072795899Apple-style-span" style="color:rgb(0, 0, 255);">--> 4 bytes o 32 bits.</span></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF">p[B]= </font><font class="yiv1072795899Apple-style-span" color="#FF007F">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - </font><font class="yiv1072795899Apple-style-span" color="#00FF80">0000 0000</font><font class="yiv1072795899Apple-style-span" color="#0000FF"> - 0000 0000 - </font>0000 0000 <span class="yiv1072795899Apple-style-span" style="color:rgb(0, 0, 255);">--> 4 bytes o 32 bits.</span></div></font></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif" size="2"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif">O</font></div><div
 style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#FF409F" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">p[R]= </font><span class="yiv1072795899Apple-style-span" style="font-size:small;">0000
 0000</span></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#00FF80" face="'lucida console', sans-serif"><span class="yiv1072795899Apple-style-span" style="font-size:small;">p[G]= </span><span class="yiv1072795899Apple-style-span" style="font-size:small;">0000 0000</span></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF" face="'lucida console', sans-serif"><span class="yiv1072795899Apple-style-span" style="font-size:small;">p[B]= </span><span class="yiv1072795899Apple-style-span" style="font-size:small;">0000 0000</span></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" color="#0000FF" face="'lucida console', sans-serif"><span class="yiv1072795899Apple-style-span" style="font-size:small;"><br></span></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" face="'lucida
 console', sans-serif" size="2"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif">Mi tercera pregunta viene en relación a la siguiente función:</font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif"><br></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" color="#0000FF" face="'lucida console', sans-serif"><div>Uint32 GetPixel(SDL_Surface *superficie, int x, int y)</div><div>{</div><div>    //Obtener la profundidad de color...</div><div>    int bpp = superficie->format->BytesPerPixel;</div><div><br></div><div>    //Obtener la posición del píxel a consultar...</div><div>    Uint8 *p = (Uint8 *)superficie->pixels + y * superficie->pitch + x *
 bpp;</div><div><br></div><div>  
  switch (bpp)</div><div>    {</div><div>        case 1:</div><div>            return *p;</div><div>            break;</div><div>            </div><div>        case 2:</div><div>            return *(Uint16 *)p;</div><div>            break;</div><div><br></div><div>        case 3:</div><div>            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)</div><div>                return p[R] << 16 | p[G] << 8 | p[B];</div><div>            else</div><div>                return p[R] | p[G] << 8 | p[B] <<
 16;</div><div><br></div><div>            break;</div><div><br></div><div>        case 4:</div><div>            return *(Uint32 *)p;</div><div>            break;</div><div><br></div><div>        default:</div><div>            return 0;</div><div>            break;</div><div>    }</div><div>}</div></font></div><div style="font-size:10pt;"><font class="yiv1072795899Apple-style-span" size="2" face="'lucida console', sans-serif"><br></font></div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">El siguiente "return " no lo entiendo bien, alguien me podría explicar a nivel de bits que hace lo siguiente:</font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console',
 sans-serif"><br></font></div><div><span class="yiv1072795899Apple-style-span" style="color:rgb(0, 0, 255);font-size:small;"><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif">return p[R] | p[G] << 8 | p[B] << 16;</font></span></div><div><font class="yiv1072795899Apple-style-span" color="#0000FF" face="'lucida console', sans-serif" size="2"><br></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">Porque si p[R], p[G] y p[B] son cada uno de un Byte o 8 bits entonces no tiene sentido el desplazamiento de bits. </font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">O, lo que hace es que: escribe los 8 bits del rojo, luego que desplace 8 bits el verde y y escriba el valor en bits del verde y por último
 que desplace 16 bits
 el azul para que el return devuelva los 24 bits como [B, G, R], o sea, una concatenación de bits.</font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">Aunque lo que yo veo es que se está usando un OR entre los tres.</font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2"><br></font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif" size="2">He tratado de explicarme lo mejor posible, sin embargo, cualquier pregunta o aclaratoria sobre los planteamientos serán bienvenidas.</font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2"><br></font></font></div><div><font class="yiv1072795899Apple-style-span"
 face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">Un cordial
 saludo,</font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2">David Lastra.</font></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif" size="2"><br></font></div><div><font class="yiv1072795899Apple-style-span" face="'lucida console', sans-serif"><font class="yiv1072795899Apple-style-span" size="2" style="font-size:10pt;">http://xdrtas.coolpage.biz/</font><br><font class="yiv1072795899Apple-style-span" size="2" style="font-size:10pt;">
http://xdrtas.blogspot.com/</font></font></div></td></tr></tbody></table></div></td></tr></tbody></table></div></td></tr></table><br>