Функция грузит не все файлы

Тема в разделе "WASM.DirectX", создана пользователем _220, 4 дек 2006.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    собсно есть фунция:
    Код (Text):
    1. bool Create32bSurfaceFrom24bBMP(LPDIRECTDRAWSURFACE7 *surface, char *fname){
    2.     HANDLE fh;
    3.     unsigned long t3;
    4.     unsigned char *buf;
    5.     BITMAPFILEHEADER bfh;
    6.     BITMAPINFOHEADER bih;
    7.     fh = CreateFile(fname,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
    8.     ReadFile(fh,&bfh,sizeof(bfh),&t3,0);
    9.     //if(bfh.bfType == 0xeb8){ Здесь проверка на Bitmap_ID, но я его не помню,
    10.     //  CloseHandle(fh);  пока просто все имена валидные
    11.     //  return false;
    12.     //}
    13.     ReadFile(fh,&bih,sizeof(bih),&t3,0);
    14.     if(bih.biBitCount != 24){
    15.         CloseHandle(fh);
    16.         return false;
    17.     }
    18.     buf = (unsigned char *)malloc(bih.biSizeImage);
    19.     SetFilePointer(fh,(-1)*(int)(bih.biSizeImage),0,FILE_END);
    20.     ReadFile(fh,buf,bih.biSizeImage,&t3,0);
    21.     CloseHandle(fh);
    22.     DDSURFACEDESC2 ddsd;
    23.     memset(&ddsd,0,sizeof(ddsd));
    24.     ddsd.dwSize = sizeof(ddsd);
    25.     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
    26.     ddsd.dwWidth = bih.biWidth;
    27.     ddsd.dwHeight = bih.biHeight;
    28.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
    29.     lpdd->CreateSurface(&ddsd,surface,NULL);
    30.     DDCOLORKEY ck;
    31.     ck.dwColorSpaceHighValue = 0;
    32.     ck.dwColorSpaceLowValue = 0;
    33.     (*surface)->SetColorKey(DDCKEY_SRCBLT,&ck);
    34.     memset(&ddsd,0,sizeof(ddsd));
    35.     ddsd.dwSize = sizeof(ddsd);
    36.     (*surface)->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
    37.     unsigned int *pbuf = (unsigned int *)ddsd.lpSurface;
    38.     unsigned char red,green,blue, *ptr = ((unsigned char *)buf);
    39.     for(int y = 0; y < bih.biHeight; ++y){
    40.         for(int x = 0; x < bih.biWidth; ++x){
    41.             blue = ptr[x * 3+0];
    42.             green = ptr[x * 3 + 1];
    43.             red = ptr[x * 3 + 2];
    44.             pbuf[x] = (blue << 0) + (green << 8) + (red << 16);
    45.         }
    46.         unsigned char *tmp = (unsigned char*)pbuf;
    47.         tmp += ddsd.lPitch;
    48.         pbuf = (unsigned int *)tmp;
    49.         ptr += bih.biBitCount/8 * bih.biWidth ;//+ 2;
    50.                          //суть как раз в этом "+2", с +2 грузит малые рисунки, но не грузит
    51. большой, и наоборот(может paint сжатие там какое-нибудь применяет), причем поверхность создается и блиттится как положено, но цвета совсем не такие
    52. (контуры приблизительно сохраняются, но цвета изменяются)
    53.     (*surface)->Unlock(NULL);
    54.     free(buf);
    55.     return true;
    56. }
    Подскажите, отчего такое может быть?
     
  2. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Все, разобрался.
    Оказывется между строками есть дыры переменного размера, т.е.
    ширина * высота * bitCount/8 вовсе не равно размеру картинки.
    Тему можно удалять.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    _220
    Не совсем так. Ширина должна быть кратна 32 битам, поэтому когда она не кратна, то дополняется нулями.