[Wine-devel] DIB engine, gdi и драйвер принтера
Sergey Novosyolov
=?iso-8859-1?q?chi_=CE=C1_office=2Eetersoft=2Eru?=
Вт Апр 14 12:49:42 MSD 2009
On Friday 10 April 2009 11:09:36 Konstantin Kondratyuk wrote:
> Первое знакомство с DIB вызвало ряд вопросов по архитектуре, реализации и
> работе:
>
> 1. Расположение dibengine.
> Вероятно, это должно быть dlls/dibengine? Ведь DIB - это драйвер, так же,
> как winex11 и psdrv.
Так было в прошлой реализации DIB Engine, но DIB Engine должен быть встроен в
GDI32 так как некоторые функции графики являются универсальными и выполняются
именно как "контекст в памяти"
>
> 2. Момент переключения DC на функции dib_funcs. Сейчас это в
> BITMAP_SelectObject, тогда как про "контекст в памяти" может быть известно
> уже на этапе создания DC с помощью CreateCompatibleDC. Возможно, ошибаюсь.
> Если ошибаюсь, то хочу понять - где.
CreateCompatibleDC вызывается всегда для того чтобы создать конекст устройства
(принтер или экран), совместимый с контекстом памяти. Поэтому изначально при
создании такого DC мы придаем ему свойства того устройства которой мы хотим
совместить с памятью. Переключение на вектор происходит, если изображение
создано с помощью CreateDIBSection, тое сть именно независимое от устройства
>
> 3. Попробовал запустить свой тест по работе с совместимым контекстом
> принтера. /* ================================================*/
> hCompatibleDC = CreateCompatibleDC (hDC);
> if(!hCompatibleDC) printf("Error\n");
>
> bitmap = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
> SelectObject (hCompatibleDC, bitmap);
>
> pen = CreatePen (BS_SOLID, 1, RGB(0,0,0));
> SelectObject (hCompatibleDC, pen);
>
> Rectangle(hCompatibleDC, rect.left + 200, rect.top + 200,
> rect.right - 200, rect.bottom - 200);
>
> if ( StartDoc( hDC, &di ) != SP_ERROR )
> {
> StartPage( hDC );
> if (!BitBlt (hDC, 0, 0, rect.right, rect.bottom,
> hCompatibleDC, rect.left, rect.top, SRCCOPY))
> printf ("BitBlt error!\n");
> EndPage( hDC );
> EndDoc( hDC );
> }
>
> DeleteDC(hCompatibleDC);
> /* ================================================*/
>
> Функция CreateCompatibleBitmap не создаёт bitmap, достаточный для того,
> чтобы SelectObject переключился на DIB. Возможно, это ошибка в самой
> функции, но она вроде бы работает с тем же CreateDIBSection, что и
> дисплейный тест...
Функция CreateCompatibleBitmap не создаёт bitmap завсисимый от контекста
устройства, тое сть совместимый с ним. Поэтому при работе с таким битмап нет
необходимости вызхова dib функций.
Подробная информация о списке рассылки Wine-devel