Bug 664

Summary: Неправильно работает Bitblt() для контекста принтера
Product: WINE@Etersoft Reporter: Vitaly Lipatov <lav>
Component: Графика GDI / DIB / GDIPLUSAssignee: Svetlana Zhukova <svzhu>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P2 CC: 1c, admin, amorozov, baraka, chi, goga, kondratyuk, lav, macter.black, shpigor, sonner, tuchkin, unicast, vasilyvz, vitperov, vostok
Version: 2.0   
Target Milestone: ---   
Hardware: PC   
OS: Ubuntu   
Whiteboard:
Заявки RT: 11037, 12253, 12293, 12514, 12712, 12730 Связано с:
Дата напоминания:
Bug Depends on: 1579    
Bug Blocks: 5445, 42, 443, 1693, 4018, 5354, 5549, 7390    
Attachments: Тест для BitBlt
Пример постскрипт-вывода последней беты.
Оригинал картинки к гарантийному талону
postscript-вывод при печати спецификации компьютера
Оригинал картинки к спецификации копмьютера
Ценник с прозрачностью
Вывод при печати в файл ценника с прозрачностью
Ценник с прозрачностью - оригинальный BMP

Description Vitaly Lipatov 2007-06-30 14:25:54 MSD
Конфигурация Торговля и склад.
Реестр документов не выводится на печать - задание просто пропадает.
При этом в консоль валится
fixme:psdrv:PSDRV_SelectBitmap stub
fixme:bitmap:BITMAP_SetOwnerDC Trying to select bitmap 0x3d18 in different DC type
Особенность возможно в пунктирной линии внутри отчёта?
Они совершенно неверно печатаются (жирными, да ещё и цветными иногда).
Comment 1 Константин Кондратюк 2007-07-04 09:52:45 MSD
fixme:psdrv:PSDRV_SelectBitmap stub
Эта ошибка выдаётся при попытке выбрать bitmap с помощью функции SelectObject. Например,
bitmap = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
SelectObject (hCompatibleDC, bitmap);

Возможно это и влияет на копирование в контекст принтера. Функция BitBlt в тесте копирует (вместо области с рисунком) чёрный прямоугольник с цветными полосами - очень похоже на тест с линией...
Comment 2 Константин Кондратюк 2007-07-04 10:01:51 MSD
Created attachment 142 [details]
Тест для BitBlt

Программа рисует серый прямоугольник в контекст памяти и потом копирует его в контекст принтера с помощью BitBlt.
Результаты:
Windows - распечатывается серый прямоугольник, как и требовалось;
wine - распечатывается чёрно-полосатый прямоугольник на месте всей копируемой области.
Comment 3 Константин Кондратюк 2007-07-04 12:06:49 MSD
Да, при прорисовке линий 1С использует CreateCompatibleBitmap() с последующим копированием в контекст принтера. Правда, судя по логам, они для этого используют PatBlt(), но скорее всего проблема одна и та же.

Прорисовка линий осуществляется с созданием bitmap'а с длиной и шириной, совпадающей с размерами линии.
Comment 4 Константин Кондратюк 2007-07-06 12:23:09 MSD
У меня проблема воспроизводится только при копировании в контекст принтера из совместимого контекста памяти (с помощью BitBlt). 
SelectBitmap может и не вызываться - проблема всё равно есть. При копировании пустой неинициализированной области в wine то же самое, в windows - пустой лист.
Comment 5 Константин Кондратюк 2007-07-06 12:24:48 MSD
PatBlt заполняет контекст текущей кистью, если вызывать её сразу после CreateCompatibleBitmap() и SelectObject(). В wine работает корректно...
Comment 6 Константин Кондратюк 2007-07-12 17:44:07 MSD
Непонятно, как проверить, на каком этапе портится картинка. GetPixel(), например, не работает с контекстом принтера и возвращает всегда CLR_INVALID. Хотя это наверное нормально, у нас принтер не поддерживает просто такую функцию.
Comment 7 Константин Кондратюк 2007-07-18 15:35:11 MSD
Вывод в контекст принтера осуществляется функцией StretchDIBits, так как pBitBlt не определена. В то же время, на дисплей корректно выводится и с той, и с другой функциями.

Кроме этого замечено, что при создании bitmap'а функцией CreateCompatibleBitmap(), он имеет размер 1х1 при привязке его к принтеру. Для дисплея - реальный размер bitmap'a. Из-за сбитой координаты могут быть проблемы, т.к. координата в тесте, например, принимают вид -999 вместо положенной 1 (?!)
Comment 8 Demakin Alexander 2008-02-20 15:20:06 MSK
Ошибка вызвана некорректной работой SelectObject для контекста принтера. SelectObject вызывает PSDRV_SelectBitmap, которая просто возвращает 0, выводя fixme.
Вывод на печать мусора обусловлен ошибкой в BitBlt, которая не проверяет значения, возвращаемого функцией GetDIBits. После исправления печатается просто белый лист.
Данная ошибка обозначена на http://bugs.winehq.org/show_bug.cgi?id=2173 со статусом ABANDONED.
Comment 9 Demakin Alexander 2008-02-27 10:54:15 MSK
Интересно следующее. При вызове CreateCompatibleBitmap() память для хранения непосредственно самих данных не выделяется, а размер битмапа устанавливается корректно. В Windows то же самое.
Затем при вызове BitBlt() код пытается получить эти данные вызовом GetDIBits(), который завершается неудачей. После получения данные копируются в конечный DC функцией StretchDIBits(), которая до исправления ошибки пыталась копировать данные из неинициализированной области памяти.
Comment 10 Demakin Alexander 2008-02-27 17:50:20 MSK
В случае работы с контекстом дисплея GetDIBits из BitBlt вообще не вызывается. Работает X11DRV_BitBlt, выполняющая все операции. Она получает информацию из переменной типа XPHYSBITMAP, определенной в X11DRV_PDEVICE.
Comment 11 Demakin Alexander 2008-02-28 12:38:51 MSK
Все функции, рисующие через контекст принтера вызывают WriteSpool16, использующую postscript. Для корректного копирования данных функцией BitBlt она должна быть реализована со стороны PSDRV. Файл bitblt.c в комментариях содержит упоминание о BitBlt, StretchBlt, PatBlt, однако, реализована лишь PSDRV_PatBlt.
Comment 12 Demakin Alexander 2008-02-28 15:58:33 MSK
WriteSpool16 записывает все функцией write непосредственно в файл. Откуда потом BitBlt должна брать данные исходной DC - непонятно. В X11DRV используется переменная типа XPHYSBITMAP, ничего подобного PSDRV_PDEVICE нет.
Comment 13 Vitaly Lipatov 2008-02-29 23:10:29 MSK
Нужно записать принятое решение по правильной реализации совместимого с принтером DC.
Comment 14 Константин Кондратюк 2008-03-24 10:22:53 MSK
Ошибка сильно мешает работе.
Попробую исправить.
Comment 15 Константин Кондратюк 2008-04-02 13:22:16 MSD
При попытке писать в CompatibleDC на самом деле ничего не происходит, не создаётся файл, не выделяется память, и записи никакой нет.
Пробуем реализовать запись в совместимый DC (создавать временный ps-файл), а потом копировать его при вызове PSDRV_PatBlt().
Comment 16 Константин Кондратюк 2008-04-03 10:44:53 MSD
Идея с созданием CompatibleDC с выводом в postscript работает. Осталось только правильно всё оформить и реализовать копирование из одного контекста в другой.
Comment 17 Константин Кондратюк 2008-04-04 18:56:26 MSD
Совместимый контекст создаётся, и в него можно записывать (пока в c:\temp.ps)
При реализации функций копирования, скорее всего, нужно будет перенести StartDocA и StartPage в функции работы с битмапом (примерно то же самое по End*-функциям).
Comment 18 Vitaly Lipatov 2008-05-22 13:04:58 MSD
Надо либо доделывать хак, либо смотреть что у нас с DIB и серьёзно браться.
Comment 19 Анатолий Лютин 2008-05-22 13:13:01 MSD
(In reply to comment #18)
> Надо либо доделывать хак, либо смотреть что
> у нас с DIB и серьёзно браться.
> 
Гм... а разве DIB не GSOC-проект?
Comment 20 Vitaly Lipatov 2008-05-22 16:07:45 MSD
Нет, не GOS.
Кстати, в рассылке wine-devel автор обсуждал не так давно что он сделал, надо действительно с ним согласоваться, и помочь подвинуть его разработку. Там уже почти всё сделано :)
Comment 21 Константин Кондратюк 2008-10-13 12:33:31 MSD
*** Bug 2450 has been marked as a duplicate of this bug. ***
Comment 22 Константин Кондратюк 2008-11-01 14:42:12 MSK
Наверное, нужно всё-таки написать хак. Лучше медленное решение печати, чем вообще без неё.
Comment 23 Vitaly Lipatov 2008-11-01 18:02:25 MSK
Исправить BitBlt будет возможно только после решения баги 2789
Comment 24 Vitaly Lipatov 2009-03-26 19:10:17 MSK
*** Bug 3506 has been marked as a duplicate of this bug. ***
Comment 25 Константин Кондратюк 2009-07-28 11:21:30 MSD
Нужно проверить в 1.0.11
Тест, воспроизводящий проблему, приложен к баге.
Comment 26 Денис Баранов 2009-07-29 21:54:56 MSD
(In reply to comment #25)
> Нужно проверить в 1.0.11
> Тест, воспроизводящий проблему, приложен к
> баге.
> 
Ошибка воспоризводится, создана отдельная бага для создания временного хака: http://bugs.etersoft.ru/show_bug.cgi?id=4156
Comment 27 Глеб Кордюков 2010-02-10 16:33:00 MSK
*** Bug 5052 has been marked as a duplicate of this bug. ***
Comment 28 Илья Шпигорь 2010-02-18 17:27:09 MSK
Выложил группу патчей.

Решение проблемы заключается в том, чтобы создавать dib секцию для битмапов, совместимых с контекстом принтера. Также была реализована функция PSDRV_SetDIBits для загрузки битового поля в эту секцию.

Проблему с печатью удалось пока решить для картинок с глубиной цвета 24 bpp. Тестировал на файлах формата PNG и bmp - успешно печатаются в 1с8.

Для поддержки картинок с другой глубиной цвета необходимо выделять битовое поле с максимальной глубиной цвета - 32 bpp. В функции PSDRV_SetDIBits надо реализовать преобразование из битового поля, получаемого от приложения, в битмап с этой максимальной глубиной.
Comment 29 Калюхович Юрий 2010-02-19 16:45:45 MSK
бутылка bugs/664
обновляю: $ wine --update
запускаю тест: $ wine a.out.so
fixme:exec:SHELL_execute flags ignored: 0x00000100

то есть, как я понял, тест ошибку не воспроизводит.каким-либо образом еще проверять нужно?
Comment 30 Vitaly Lipatov 2010-02-19 16:54:44 MSK
По тесту проверять не надо.
Я думаю, эта бага вообще далеко не закрыта, потому что сделанное решение проверено только для баги 5052.
Тут вообще надо смотреть по заявкам - что у них была за проблема, и отписываться им, если работает.
Я думаю, это чуть позже, когда будет полное решение.
Comment 31 Калюхович Юрий 2010-02-19 17:07:30 MSK
бутылка 1c81/1c81AccountingBase. запустил 1С, база торговля. Открыл файл с:/ps/screen.mxl, нажал печать -> "печать в файл"
текст и картинка корректно отображены в jpg-файле
Comment 32 Глеб Кордюков 2010-02-24 12:24:03 MSK
Клиентам предварительно анонсировано о решении проблемы.
Но думаю стоит проверять, как сказал Виталик, по каждому случаю.
Comment 33 Илья Шпигорь 2010-02-25 12:45:02 MSK
Выложил еще один патч.

Дело в том, что предыдущие изменения внесли ошибку. В программе checkxml фон стал отрисовываться перевернутым.

Это связано с изменениями в SetBitmapBits. Вместо этого при печати картинка теперь переворачивается в StretchBlt и на работу X11DRV никак не влияет.
Comment 34 Sergey Tuchkin 2010-03-02 18:54:56 MSK
Created attachment 1551 [details]
Пример постскрипт-вывода последней беты.

Пример постскрипт-вывода последней беты wine.
Битмап (логотип) смогу приложить завтра.

WINE@Etersoft 1.0 SQL 1.0.12-eter3/1
Product: WINE@Etersoft 1.0 SQL (корпоративная лицензия, коробочная версия)
Licensed for ЗАО "Мезон" with registration number 509D-4CCC
Comment 35 Илья Шпигорь 2010-03-03 10:26:59 MSK
Нельзя ли приложить скриншот или постскрипт как должно быть?

Comment 36 Vitaly Lipatov 2010-03-03 12:41:37 MSK
(In reply to comment #35)
> Нельзя ли приложить скриншот или
> постскрипт как должно быть?
А так не понятно, что картинка троится? 
Comment 37 Sergey Tuchkin 2010-03-03 14:18:43 MSK
Created attachment 1554 [details]
Оригинал картинки к гарантийному талону

Извиняюсь, вчера не успел приложить
Comment 38 Sergey Tuchkin 2010-03-03 14:55:10 MSK
Created attachment 1556 [details]
postscript-вывод при печати спецификации компьютера
Comment 39 Sergey Tuchkin 2010-03-03 14:56:27 MSK
Created attachment 1557 [details]
Оригинал картинки к спецификации копмьютера
Comment 40 Илья Шпигорь 2010-03-03 15:44:40 MSK
> Created an attachment (id=1557) [details]
> Оригинал картинки к спецификации
> копмьютера

Чтобы решить именно эту проблему - сохраните картинку в bmp формате с глубиной цвета 24 bpp. После этого 1С должна ее нормально печатать.

Comment 41 Тарасов Константин 2010-03-26 10:39:15 MSK
Было установлено обновление 1.0.12. Проблема не исчезла. На месте графического изображения на печать выводиться прямоугольник заполненный черным цветом.

Приложение из которого производится печать: 1С:Предприятие 8.2
Операционная система: Ubuntu 9.10
тестировалось с изображениями в форматах: jpg и png

Comment 42 Денис Баранов 2010-03-29 19:36:31 MSD
(In reply to comment #41)
> Было установлено обновление 1.0.12. Проблема
> не исчезла. На месте графического
> изображения на печать выводиться
> прямоугольник заполненный черным цветом.
> 
> Приложение из которого производится
> печать: 1С:Предприятие 8.2
> Операционная система: Ubuntu 9.10
> тестировалось с изображениями в форматах:
> jpg и png
> 

Вы печатаете рисунки с глубиной цвета 24bpp? 
Из Комментарий #40 видно что пока осуществляется печать только таких изображений.
Comment 43 Тарасов Константин 2010-03-29 23:06:15 MSD
Да, я прочитал комментарий относительно bmp 24bpp. Но мне требуется использовать изображение с прозрачным фоном, т.к. должно быть видно то, что написано под изображением. В данном случае bmp не поможет.
Comment 44 Sergey Tuchkin 2010-04-04 23:47:58 MSD
Возникла довольно острая потребность в печати изображений с прозрачным фоном. Каковы ориентировочные сроки исправления бага с печатью таких изображений?
Comment 45 Vitaly Lipatov 2010-04-05 01:45:59 MSD
(In reply to comment #44)
> Возникла довольно острая потребность в
> печати изображений с прозрачным фоном.
> Каковы ориентировочные сроки исправления
> бага с печатью таких изображений?
Работаем, будем стараться решить на неделе.

Comment 46 Sergey Tuchkin 2010-04-05 01:52:04 MSD
Это было бы просто замечательно! Если возможно - держите, пожалуйста, в курсе, как оно продвигается.
Comment 47 Илья Шпигорь 2010-04-06 12:11:16 MSD
(In reply to comment #44)
> Возникла довольно острая потребность в
> печати изображений с прозрачным фоном.

Не могли бы Вы приложить такое изображение к баге? Необходимо для тестирования.
Comment 48 Илья Шпигорь 2010-04-06 14:45:10 MSD
Если есть возможность, лучше прислать mxl файл, демонстрирующий проблему с прозрачностью.

Comment 49 Sergey Tuchkin 2010-04-07 15:02:50 MSD
Created attachment 1629 [details]
Ценник с прозрачностью
Comment 50 Sergey Tuchkin 2010-04-07 15:57:32 MSD
Created attachment 1630 [details]
Вывод при печати в файл ценника с прозрачностью
Comment 51 Sergey Tuchkin 2010-04-07 15:59:24 MSD
Created attachment 1631 [details]
Ценник с прозрачностью - оригинальный BMP

В качестве прозрачного при добавлении картинки в 1С выбран белый цвет
Comment 52 Илья Шпигорь 2010-04-08 17:26:59 MSD
Выложил патч. 

Добавил преобразование картинок из 32 bpp в 24 bpp. Поэтому сейчас поддерживается печать и тех и других.

Картинки с расширением png также корректно печатаются.
Comment 53 Sergey Tuchkin 2010-04-10 00:45:56 MSD
скажите пожалуйста, когда можно будет загрузить обновленный пакет?
Comment 54 Денис Баранов 2010-04-11 17:55:21 MSD
Принято.
WINE@Etersoft 1.0.12 eter5/eter4
Comment 55 Денис Баранов 2010-04-11 17:55:58 MSD
(In reply to comment #53)
> скажите пожалуйста, когда можно будет
> загрузить обновленный пакет?
> 

Вы можете заказать сборку на странице продукта с меткой testing
Comment 56 Илья Шпигорь 2010-04-12 12:34:35 MSD
Проблема печати изображений с прозрачным фоном еще не решена. На нее заведена отдельная бага:

http://bugs.etersoft.ru/show_bug.cgi?id=5445
Comment 57 Vitaly Lipatov 2010-04-13 13:41:37 MSD
Нужно ли отписываться по заявкам?
Comment 58 Sergey Tuchkin 2010-04-15 17:23:04 MSD
изображение http://bugs.etersoft.ru/attachment.cgi?id=1557 по-прежнему печатается неправильно (см. http://bugs.etersoft.ru/attachment.cgi?id=1556)

То же самое изображение печатается корректно после преобразования в BMP или PNG
Comment 59 Илья Шпигорь 2010-05-05 14:13:23 MSD
(In reply to comment #58)
> изображение http://bugs.etersoft.ru/attachment.cgi?id=1557
> по-прежнему печатается неправильно 

Эта картинка в jpeg формате. На проблему завел багу:

http://bugs.etersoft.ru/show_bug.cgi?id=5549
Comment 60 Виталий Перов 2011-07-27 15:56:52 MSK
Откатил патчи:

commit ee6ed17b882b152ad9043fdd90abcaf07e3d5b44
Author: Ilya Shpigor <shpigor@etersoft.ru>
Date:   Thu Feb 18 16:21:59 2010 +0300

    wineps.drv: Implementation PSDRV_SetDIBits function (eterbug #664)

commit 769c00145b637b9d1a8280e1c88143b2c2fd77a4
Author: Ilya Shpigor <shpigor@etersoft.ru>
Date:   Tue Apr 6 11:33:00 2010 +0400

    wineps.drv: Add convertion 32 bpp DIB bitmaps to 24 bpp (eterbug #664)

commit 2eb9ed8b2ec27cfc20226f2994a28c816b6958d1
Author: Ilya Shpigor <shpigor@etersoft.ru>
Date:   Fri May 7 14:10:28 2010 +0400

    wineps.drv: Add convertion 8 bpp DIB bitmaps to 24 bpp (eterbug #5549)


Из графического драйвера, за ненадобностью убрали указатель pSetDIBits.
В wine появляется своя реализация DIB, видимо теперь это делается как-то через новый драйвер.

Для начала требуется проверить осталась ли бага.

Изменения точно будут в eterhack начиная с версии 1.3.25-alt1.3
Если нужно раньше, то можно убедиться в наличии коммита:
e4e1f842c8f8fa10465c381df3ba345a66f64789
Comment 61 Svetlana Zhukova 2011-08-12 11:22:55 MSK
wine@eterhack bottle bugs/664
WINE@Etersoft version 1.3.25-eter1.8
1с77, торговля и склад.
Все печатается корректно.
Comment 62 Александр Морозов 2012-01-13 11:26:28 MSK
Откатил в eterhack патч:

commit 86d5cfb3aeb7fcfe3c6d1efef9cddb17aae3febf
Author: Ilya Shpigor <shpigor@etersoft.ru>
Date:   Thu Feb 18 16:17:15 2010 +0300

    gdi32: Create DIB section for compatible with the printer DC bitmaps (eterbug #664)

Надо будет проверить, работает ли без него.
Comment 63 Svetlana Zhukova 2012-01-16 11:06:47 MSK
eterhack bottle 1c77/664
$ ww --version
WINE@Etersoft SQL 1.3.36/2.0.0-eter1.4/8
Печать корректна.