void __fastcall TForm1::FormActivate(TObject *Sender)
{
HANDLE hFile;
AnsiString FileName;
DWORD pPixels;
Word nColors;
DWORD Count, Size;
DWORD Size1; //для вспомогательных целей, напрямую не использую
if(OpenDialog1->Execute())
{
FileName = OpenDialog1->FileName;
//откроем файл
hFile = CreateFile(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Size = GetFileSize(hFile, &Size1);
//выделим память под файл
FullBitmap = malloc(Size);
//считаем файл в память
ReadFile(hFile, FullBitmap, Size, &Size1, NULL);
//закроем файл
CloseHandle(hFile);
asm
{
push ebx;
mov ebx, FullBitmap;
add ebx, 10; //получим адрес bfOffBits
mov eax, [ebx];
mov pPixels, eax; //получим это число
add ebx, 8; //получим адрес biWidth
mov eax, [ebx];
mov BitWidth, eax;
add ebx, 4; //получим адрес biHeight
mov eax, [ebx];
mov BitHeight, eax;
add ebx, 6; //получим адрес biBitCount
mov eax, [ebx];
mov nColors, ax;
pop ebx;
}
if(nColors != 24)
{
AnsiString Mes = "ColorBits = " + IntToStr(nColors);
Application->MessageBox("Данная версия программы поддерживает
только true color рисунки",
Mes.c_str(), MB_ICONSTOP);
Close();
return;
}
asm
{
mov eax, FullBitmap;
add eax, pPixels;
mov Pixels, eax;
}
Count = Size - pPixels;
//необходимо поменять местами красную и синюю компоненты
asm
{
push ebx;
push ecx;
push edx;
mov ebx, Pixels;
mov ecx, 0; //счетчик пикселей
@C1:
mov eax, [ebx+ecx]; //грузим исходный пиксель + лишний байт
mov dl, al; //временно запомним
shr eax, 16; //поставим цвет на правильное место
mov [ebx+ecx], al; //заменим один цвет
add ecx, 2; //второй цвет находится через 2 байта
mov [ebx+ecx], dl; //заменим второй цвет
inc ecx; //перейдем на следующий пиксель
cmp ecx, Count; //обработан весь рисунок?
jl @C1; //перейдем на начало цикла
pop edx;
pop ecx;
pop ebx;
}
//занесем этот рисунок в текстуру
//определим, как будет масштабироваться текстура
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//запихаем рисунок
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BitWidth, BitHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE, Pixels);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
EnableDrawing = true;
Repaint();
}
else Close(); //нажата кнопка Отмена
}
Sergey Kaluzhskiy 2:5055/89.27
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|