[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