собсно есть фунция: Код (Text): bool Create32bSurfaceFrom24bBMP(LPDIRECTDRAWSURFACE7 *surface, char *fname){ HANDLE fh; unsigned long t3; unsigned char *buf; BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; fh = CreateFile(fname,GENERIC_READ,0,0,OPEN_EXISTING,0,0); ReadFile(fh,&bfh,sizeof(bfh),&t3,0); //if(bfh.bfType == 0xeb8){ Здесь проверка на Bitmap_ID, но я его не помню, // CloseHandle(fh); пока просто все имена валидные // return false; //} ReadFile(fh,&bih,sizeof(bih),&t3,0); if(bih.biBitCount != 24){ CloseHandle(fh); return false; } buf = (unsigned char *)malloc(bih.biSizeImage); SetFilePointer(fh,(-1)*(int)(bih.biSizeImage),0,FILE_END); ReadFile(fh,buf,bih.biSizeImage,&t3,0); CloseHandle(fh); DDSURFACEDESC2 ddsd; memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = bih.biWidth; ddsd.dwHeight = bih.biHeight; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; lpdd->CreateSurface(&ddsd,surface,NULL); DDCOLORKEY ck; ck.dwColorSpaceHighValue = 0; ck.dwColorSpaceLowValue = 0; (*surface)->SetColorKey(DDCKEY_SRCBLT,&ck); memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); (*surface)->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); unsigned int *pbuf = (unsigned int *)ddsd.lpSurface; unsigned char red,green,blue, *ptr = ((unsigned char *)buf); for(int y = 0; y < bih.biHeight; ++y){ for(int x = 0; x < bih.biWidth; ++x){ blue = ptr[x * 3+0]; green = ptr[x * 3 + 1]; red = ptr[x * 3 + 2]; pbuf[x] = (blue << 0) + (green << 8) + (red << 16); } unsigned char *tmp = (unsigned char*)pbuf; tmp += ddsd.lPitch; pbuf = (unsigned int *)tmp; ptr += bih.biBitCount/8 * bih.biWidth ;//+ 2; //суть как раз в этом "+2", с +2 грузит малые рисунки, но не грузит большой, и наоборот(может paint сжатие там какое-нибудь применяет), причем поверхность создается и блиттится как положено, но цвета совсем не такие (контуры приблизительно сохраняются, но цвета изменяются) (*surface)->Unlock(NULL); free(buf); return true; } Подскажите, отчего такое может быть?
Все, разобрался. Оказывется между строками есть дыры переменного размера, т.е. ширина * высота * bitCount/8 вовсе не равно размеру картинки. Тему можно удалять.
_220 Не совсем так. Ширина должна быть кратна 32 битам, поэтому когда она не кратна, то дополняется нулями.