Newsgroup: it.comp.programmare.win32
Titolo: Care amate DIB

Ho un piccolo problema con le DIB. Molto semplicemente, ho una immagine
inquesto formato e la devo spedire ad un DC. Ho trovato un'utilissima
funzione del GDI per fare cio' ma non riesco ad ottenere altro che un
blocco nero disegnato sullo schermo (o sulla stampate).
Ecco il codice incriminato:
typedef struct {
  BITMAPINFOHEADER   bmiHeader;
  RGBQUAD            bmiColors[256];
} SBITMAPINFO;
static int GdiPutPhoto (
  HDC dest,
  Tk_PhotoHandle photo,
  int destLeft, int destTop,
  int destWidth, int destHeight
  )
{
  int      err;
  int      srcWidth, srcHeight;
  Tk_PhotoImageBlock  photoBlock;
  SBITMAPINFO    info;
  char      *buffer, *destAddr, *srcAddr;
  int      x, y, component, rcaps, i, j;
  Tk_PhotoGetSize (photo, &srcWidth, &srcHeight);
  Tk_PhotoGetImage (photo, &photoBlock);
  buffer = malloc (srcWidth * srcHeight * 3);
//  buffer = Tcl_Alloc (srcWidth * srcHeight * 3);
  if (buffer)
  {
    destAddr = buffer;
    for (y = 0; y < srcHeight; y++)
    {
      for (x = 0; x < srcWidth; x++);
      {
        for (component = 0; component < 3; component++)
        {
          srcAddr =   photoBlock.pixelPtr +
              photoBlock.pitch * y +
              photoBlock.pixelSize * x +
              photoBlock.offset [component];
          *destAddr = *srcAddr;
          destAddr++;
        }
      }
    }
    info.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    info.bmiHeader.biWidth = srcWidth;
    info.bmiHeader.biHeight = srcHeight;
    info.bmiHeader.biPlanes = 1;
    info.bmiHeader.biBitCount = 24;
    info.bmiHeader.biCompression = 0;
    info.bmiHeader.biSizeImage = srcWidth * srcHeight * 3;
    info.bmiHeader.biXPelsPerMeter = 0;
    info.bmiHeader.biYPelsPerMeter = 0;
    info.bmiHeader.biClrUsed = 0;
    info.bmiHeader.biClrImportant = 0;
    for (j = 0; j < 256; ++j)
    {
      info.bmiColors[j].rgbRed = 0;
      info.bmiColors[j].rgbGreen = 0;
      info.bmiColors[j].rgbBlue = 0;
      info.bmiColors[j].rgbReserved = 0;
    }
    rcaps = GetSystemPaletteEntries (dest, 0, 256,info.bmiColors);
    /*
    if (StretchDIBits (  dest, destLeft, destTop, destWidth, destHeight,
          0, 0, srcWidth, srcHeight,
          buffer, &info,
          DIB_RGB_COLORS, SRCCOPY
          ) == GDI_ERROR)
      err = TCL_ERROR;
    */
    SetDIBitsToDevice (  dest, destLeft, destTop, destWidth, destHeight,
          0, 0, 0, srcHeight - 1, buffer, &info,
          DIB_RGB_COLORS
          );
    free (buffer);
//    Tcl_Free (buffer);
  }
  else
    err = TCL_ERROR;
  return err;
}
Il codice preleva l'immagine dal runtime del TCL/TK.
Ho guardato col debugger, e prima della chiamata SetDIBitsToDevice (o
StretchDIBits) buffer contiene l'immagine corretta.
Qualcuno sa dirmi dove potrei aver sbagliato?
Grazie
--
Fabrizio Di Giuseppe
Real email address: fdigiuseppe@_REMOVEME_netscape.net
http://www.iride.com/fabrizio
Sent via Deja.com 
http://www.deja.com/
Before you buy.


Vedo che usi le SDK...
con le MFC so che devi necessariamente selezionare la bitmap in un DC di
memoria compatibile con quello sul quale devi uscire, quindi eseguire una
Stretch tra i due DC; vista la natura delle MFC, forse vale lo stesso
discorso...
Ciao,
Gianfranco

 Ho un piccolo problema con le DIB.
[SNIP]
Si diventa scemi per certe cose:
...
     for (y = 0; y < srcHeight; y++)
     {
       for (x = 0; x < srcWidth; x++); <-- simpatico, vero?
       {
         for (component = 0; component < 3; component++)
         {
           srcAddr =   photoBlock.pixelPtr +
               photoBlock.pitch * y +
               photoBlock.pixelSize * x +
               photoBlock.offset [component];
           *destAddr = *srcAddr;
           destAddr++;
         }
       }
     }
Ci ho messo due giorni ad accorgermene.
--
Fabrizio Di Giuseppe
Real email address: fabrizio@_REMOVEME_iride.com


Ci ho messo due giorni ad accorgermene.
se tu avessi scritto
for (int x = 0; x < srcWidth; x++)   // dichiarazione di x
// x scelto in modo che nello scope non ci sia altra x di tipo 
// compatibile
avendo usato una variabile locale al for, il compilatore (se minimamente
standard) ti avrebbe dato un messaggio di errore
photoBlock.pixelSize * x   // unknown identifier x
e ci avresti messo 2 secondi a capire l'errore!
Morale, localizzare quanto piu` possibile le variabili specie
quelle di iterazione!
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------

>        for (x = 0; x < srcWidth; x++); <-- simpatico, vero?
AAAAH! (ODIO I PUNTI E VIRGOLA , LI ODIO LI ODIO LI ODIO)
Giusto sfogo -)))
--
Ciao , Ricardo Antonio Piana
ricard...@tiscalinet.it
http://web.tiscalinet.it/ricardopiana
***