Тест 3. Работа с буфером через посредника.
Нет возможности работать с буфером загруженных картинок. Вывод: надо создать картинку в памяти и нарисовать в неё загруженную. Проверим:
xAppTitle("sample");
xGraphics3D(800, 600, 32, false, true);
xSetBuffer(xBackBuffer());
bool MOD=true;
int IMstd;
int IMstd0=xLoadImage("Funivia_Rote_Nase_alt_small.jpg");
IMstd=xCreateImage(xImageWidth(IMstd0),xImageHeight(IMstd0));
if(IMstd==0)
xAppTitle("n load");
else
xAppTitle("OK");
int CB=xGraphicsBuffer();
xSetBuffer(xImageBuffer(IMstd));
xDrawBlock(IMstd0,0,0);
xSetBuffer(CB);
xFreeImage(IMstd0);
if(MOD){
xSetBuffer(xImageBuffer(IMstd));
xLine(0,0,10,10);
}
xSetBuffer(CB);
while(!xKeyDown(1) || xWinMessage("WM_CLOSE"))
{
xCls();
xRenderWorld();
xDrawBlock(IMstd,10,10);
xFlip();
}
xFreeImage(IMstd);
return 0;
Всё действительно работает!
Отмечу, что код
xSetBuffer(xImageBuffer(IMstd));
xDrawBlock(IMstd0,0,0);
xSetBuffer(CB);
В принципе может быть заменён на
xCopyRect(0,0,xImageWidth(IMstd0),xImageHeight(IMstd0),0,0,
xImageBuffer(IMstd0),xImageBuffer(IMstd));
Но у меня, почему-то в одном месте не заработал - постараюсь разобраться с этим.
Попробуем картинку побольше:
Теперь, если выполнить такой код:
xAppTitle("sample");
xGraphics3D(800, 600, 32, false, true);
xSetBuffer(xBackBuffer());
bool MOD=true;
int IMstd;
int IMstd0=xLoadImage("Funivia_Rote_Nase_alt_med.jpg");
IMstd=xCreateImage(xImageWidth(IMstd0),xImageHeight(IMstd0));
if(IMstd==0)
xAppTitle("n load");
else
xAppTitle("OK");
int CB=xGraphicsBuffer();
xSetBuffer(xImageBuffer(IMstd));
xDrawBlock(IMstd0,0,0);
xSetBuffer(CB);
xFreeImage(IMstd0);
if(MOD){
xSetBuffer(xImageBuffer(IMstd));
xLine(0,0,10,10);
}
xSetBuffer(CB);
while(!xKeyDown(1) || xWinMessage("WM_CLOSE"))
{
xCls();
xRenderWorld();
xDrawBlock(IMstd,10,10);
xFlip();
}
xFreeImage(IMstd);
return 0;
Вы вообще ничего не увидите (даже если опустите флаг
MOD), а если такой:
xAppTitle("sample");
xGraphics3D(800, 600, 32, false, true);
xSetBuffer(xBackBuffer());
bool MOD=true;
int IMstd;
int IMstd0=xLoadImage("Funivia_Rote_Nase_alt_med.jpg");
IMstd=xCreateImage(xImageWidth(IMstd0),xImageHeight(IMstd0));
if(IMstd==0)
xAppTitle("n load");
else
xAppTitle("OK");
int CB=xGraphicsBuffer();
xCopyRect(0,0,xImageWidth(IMstd0),xImageHeight(IMstd0),0,0,
xImageBuffer(IMstd0),xImageBuffer(IMstd));
xFreeImage(IMstd0);
if(MOD){
xSetBuffer(xImageBuffer(IMstd));
xLine(0,0,10,10);
}
xSetBuffer(CB);
while(!xKeyDown(1) || xWinMessage("WM_CLOSE"))
{
xCls();
xRenderWorld();
xDrawBlock(IMstd,10,10);
xFlip();
}
xFreeImage(IMstd);
return 0;
То увидите картинку, но без нарисованной на ней прямой линии.
Выводы:
1) Чтобы иметь возможность работать с буфером загруженной картинки, её необходимо впечатать во вновь созданную.
2) Если размеры картинки превышают размеры окна - описанный выше способ не поможет:
2.1) если вы будете использовать функцию попиксельного копирования
xCopyRect, то загруженное изображение корректно перенесётся в буфер созданного в памяти, но рисовать в буфер всё равно не получится - команды не возымеют результата;
2.2) если вы попробуете нарисовать загруженную картинку в буфер созданной - то не получите вообще ничего.