Показать сообщение отдельно
Старый 04.03.2012, 04:14   #23
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Image и артефакты

Тест 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));
Но у меня, почему-то в одном месте не заработал - постараюсь разобраться с этим.

Попробуем картинку побольше:
Нажмите на изображение для увеличения
Название: Funivia_Rote_Nase_alt_med.jpg
Просмотров: 967
Размер:	95.7 Кб
ID:	16273
Теперь, если выполнить такой код:
   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) если вы попробуете нарисовать загруженную картинку в буфер созданной - то не получите вообще ничего.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием