Вход:  Пароль:  
FreeSource: WINE/Разработчику/Изображения ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Проблемы с изображением

Ситуация с DIB


Есть DC. Он связан с устройством, и его обрабатывают функции драйвера (WINEX11).
Созданный на его основе Compatible DC? (memdc), выполняющий все операции над DIB (в памяти), должен обрабатываться функциями DIB Engine.
В gdi32 вызов нужной функции драйвера происходит на основе таблицы с функциями, указатель на которую (dc->funcs) хранится в объекте. Если функция присутствует, она вызывается. Если функции нет, возможно использование альтернативной реализации прямо из gdi32.


Последняя реализация использует хак в Select Object?, которая если вызвана для memdc, подгружает драйвер DIB, его функции попадают в таблицу, и далее для этого объекта вызываются только функции DIB Engine.


Наша цель в этой таблице функций (для memdc) постепенно (по мере разработки) подменять функции драйвера на функции DIB Engine.


CyrilMargorin /11.10.2008 11:48/
Есть ли для этого Test cases? Сегодня к вечеру попробую просмотреть, чтобы понять выше написаное (без кода, описание не совсем понятно).


Кирилл, я уже и потерял связь давно... Может быть спишемся, или в аське/джаббере? JID: lav@im.etersoft.ru


CyrilMargorin /11.10.2008 17:56/
К сожалению, из дома в аське стараюсь не сидеть (ибо она у меня рабочая). Джаббер соответсвует е-мылу: comargo@gmail.com, но тоже забываю включить дома. На работе включена всегда.
Сейчас пока включил.


Некие проблемы с графикой


Проблемы с изображением можно увидеть на


Ситуация:
1. код около функции BITMAP_Object неверный
2. патч тоже неверный
3. в /wine/dlls/gdi/tests/bitmap.c
должны быть тесты об этом, они тоже неверные (если их исправить, они должны работать на Windows и не работать в wine)


Патч, корректирующий проблему для КОМПАСА


//Похоже надо через таблицу цветов превращать из 24х битовой в 4х битовую....
При этом надо учитывать, что кроме 24х битового дисплея бывает еще и 32 и 16.... а иногда и 8ми.....
В теории можно повнимательней просмотреть код около функции X11_GetDIBits() (или как то так она называется) и еще (скорее всего) необходимо сделать схожие изменения в функции X11_SetBitmapBits...//


CyrilMargorin /10.12.2005 01:38/
Появилась для обсуждение идея, перевести функцию CopyImage с Get/SetBitmapBits на Get/SetDIBits. Попытка сделать это в общем-то была успешна....




CyrilMargorin /13.02.2006 23:32/
После дальнейшего исследования проблемы с пропавшей заставкой в
Компасе выяснилось, что проблема состоит в том, что функция Get DI Bits?
возвращает «черную» картинку.
При этом, компиляция wine с выключенной поддержкой Shared Memory
картинку проявило.
Таким образом наткнулись на следующий момент
Есть следующий код:
dlls/x11drv/dib.c функция X11DRV_DIB_GetImageBits


В случае, если descr->image равен нулю, создается новый XImage, без поддержки Shared Memory, но если был передан параметр useShm, для получения XImage из Pixmap используется функция с поддержкой Shared Memory, которая есстественно не срабатывает в данном случае. (Схожий код исспользуется в X11DRV_DIB_SetImageBits).
Таким образом, первый патч заключается в проверке, создавалася ли XImage локально, или исспользовался внешний?

Внимание вопрос: А может быть имеет смысл попытаться создать Shared Memory XImage? Или эта операция недостаточно быстрая и будет тормозить систему?


Второй момент:
В функции X11DRV_GetDIBits при заполнении структуры X11DRV_DIB_IMAGEBITS_DESCR descr в поле image записывался NULL. Соответственно было изменено на существующий XImage из physBitmap.

Внимание вопрос: А в функции X11DRV_SetDIBits тоже наверно надо передавать image из physBitmap?


Оба патча вошли в репозиторий cvs.winehq.org 13 февраля 2006.


Страницы, ссылающиеся на данную: WINE/Разработчику


 
Файлов нет. [Показать файлы/форму]
Комментарии [Скрыть комментарии/форму]

Я попробывал запустить КОМПАС-3D LT V8, но никакого «падения» не обнаружил.
Единственный недостаток – вместо красивого splash-screen'а – черный прямоугольник.

-- CyrilMargorin (2005-11-20 01:26:52)

Значит падает Viewer 8.0
А какая у вас ОС?

-- VitalyLipatov (2005-11-21 14:15:35)

В данный момент ошибка локализированна в данном тестовом примере


static void test_copyimage(void)
{

HDC hdc;
HBITMAP hdib, hdib1;
BITMAPINFO bmi;

hdc = Get DC?(0);
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biHeight = 9;
bmi.bmiHeader.biWidth = 319;
bmi.bmiHeader.biBitCount = 4;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = ((bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount * bmi.bmiHeader.biPlanes +31) & 31) /8
                                      • bmi.bmiHeader.biHeight;
hdib = Create DIB Section?(hdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
ok(hdib != NULL, "Create DIB Section? failed\n");
hdib1 = Copy Image?(hdib,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
ok(hdib1 != NULL, "Copy Image? 1 failed\n");


Delete Object?(hdib1);
Delete Object?(hdib);
Release DC?(0,hdc);

}


На выполнении Copy Image? падаем... судя по всему данная ошибка специфична для 4-х битового изображения.

-- 82.138.56.6 (2005-11-24 03:39:22)

Была замечена небольшая ошибка, которая не влияет на результат теста.
программа для теста:


#include <windows.h>
#include <stdio.h>


void main()
{

HDC hdc;
HBITMAP hdib, hdib1;
char bmibuf[sizeof(BITMAPINFO)+sizeof(RGBQUAD)*16];
BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf;


hdc = Get DC?(0);
memset(pbmi, 0, sizeof(bmibuf));
pbmi->bmiHeader.biSize = sizeof(pbmi->bmiHeader);
pbmi->bmiHeader.biHeight = 9;
pbmi->bmiHeader.biWidth = 319;
pbmi->bmiHeader.biBitCount = 4;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biBitCount * pbmi->bmiHeader.biPlanes +31) & 31) /8 * pbmi->bmiHeader.biHeight;
hdib = Create DIB Section?(hdc, pbmi, DIB_RGB_COLORS, NULL, NULL, 0);
if(hdib == NULL)
{
fprintf(stderr,"Create DIB Section? failed\n");
return;

}
hdib1 = Copy Image?(hdib,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
if(hdib == NULL)
{

fprintf(stderr,"Copy Image? 1 failed\n");
return;
}


Delete Object?(hdib1);
Delete Object?(hdib);
Release DC?(0,hdc);

}


Результат падения:


First chance exception: page fault on write access to 0x6a6aeef2 in 32-bit code (0x4018fb3c).
Register dump:
CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:005f
EIP:4018fb3c ESP:4067fd94 EBP:4067fdb0 EFLAGS:00210202( – 00 – -RI1)
EAX:ababab6a EBX:401c371c ECX:4036b9e8 EDX:6a6aeeee
ESI:4036b9e0 EDI:000005a0
Stack dump:
0x4067fd94: 4036b9e8 00000000 40320000 40320000
0x4067fda4: 406e8ba8 4036b3f8 40320000 4067fdd4
0x4067fdb4: 406a6c4c 40320000 00000002 000005a0
0x4067fdc4: 000000a0 407fe620 4036b440 000001d0
0x4067fdd4: 4067fe38 4077f51c 000001d0 000005a0
0x4067fde4: 4036b440 40abdd20 40abdd60 00000000
Backtrace:
=>1 0x4018fb3c Rtl Allocate Heap?+0x8c(heap=0x40320000, flags=0x2, size=0x5a0) [/home/cyril/prj/wine/dlls/ntdll/../../include/wine/list.h:98] in ntdll (0x4018fb3c)

2 0x406a6c4c Set Bitmap Bits?+0xec(hbitmap=0x1d0, count=0x5a0, bits=0x4036b440) [/home/cyril/prj/wine/dlls/gdi/bitmap.c:401] in gdi32 (0x406a6c4c)
3 0x4077f51c Copy Image?(hnd=0x1cc, type=0x0, desiredx=0x0, desiredy=0x0, flags=0x2000) [/home/cyril/prj/wine/dlls/user/../../include/winbase.h:2252] in user32 (0x4077f51c)
4 0x405741dd main in wine-tst (0x405741dd)
5 0x405742ca __wine_spec_exe_entry(peb=0x401d16e0) [/home/cyril/prj/wine/dlls/winecrt0/exe_entry.c:37] in wine-tst (0x405742ca)
6 0x40495306 start_process(arg=0x0) [/home/cyril/prj/wine/dlls/kernel/process.c:992] in kernel32 (0x40495306)
7 0x4002d9a1 wine_switch_to_stack+0x11 in libwine.so.1 (0x4002d9a1)

0x4018fb3c Rtl Allocate Heap?+0x8c [/home/cyril/prj/wine/dlls/ntdll/../../include/wine/list.h:98] in ntdll: movl %eax,0x4(%edx)
98 elem->next->prev = elem->prev;

-- CyrilMargorin (2005-11-24 04:12:25)

Дополнения по баге:
1) Судя по всему, место падения – наведенное.
2) При глубине цветности 4бита «физический pixmap» обладает 24мя битами:


Для «чистоты» теста, после дополнительного расследования логов от «Компаса» обнаружил, что картинка не создавалась в ручную, а была загружена из ресурсов. Пришлось у M$ Windows позаимстовать 16ти цветный битмап.
Ищем дальше...

-- CyrilMargorin (2005-11-25 02:34:52)

Зря вписал всё это в комментарий, потому что теперь не отредактируешь и не удалишь.

-- VitalyLipatov (2005-12-05 01:07:57)

ну я, судя по всему, свои коментарии удалить могу....

-- CyrilMargorin (2005-12-10 01:41:17)