Summary: | Неправильно работает Bitblt() для контекста принтера | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Графика GDI / DIB / GDIPLUS | Assignee: | 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 | Связано с: | 1840, 2789 |
Дата напоминания: | |||
Bug Depends on: | 1579 | ||
Bug Blocks: | 42, 443, 1693, 4018, 5354, 5445, 5549, 7390 | ||
Attachments: |
Тест для BitBlt
Пример постскрипт-вывода последней беты. Оригинал картинки к гарантийному талону postscript-вывод при печати спецификации компьютера Оригинал картинки к спецификации копмьютера Ценник с прозрачностью Вывод при печати в файл ценника с прозрачностью Ценник с прозрачностью - оригинальный BMP |
Description
Vitaly Lipatov
2007-06-30 14:25:54 MSD
fixme:psdrv:PSDRV_SelectBitmap stub Эта ошибка выдаётся при попытке выбрать bitmap с помощью функции SelectObject. Например, bitmap = CreateCompatibleBitmap(hDC, rect.right, rect.bottom); SelectObject (hCompatibleDC, bitmap); Возможно это и влияет на копирование в контекст принтера. Функция BitBlt в тесте копирует (вместо области с рисунком) чёрный прямоугольник с цветными полосами - очень похоже на тест с линией... Created attachment 142 [details]
Тест для BitBlt
Программа рисует серый прямоугольник в контекст памяти и потом копирует его в контекст принтера с помощью BitBlt.
Результаты:
Windows - распечатывается серый прямоугольник, как и требовалось;
wine - распечатывается чёрно-полосатый прямоугольник на месте всей копируемой области.
Да, при прорисовке линий 1С использует CreateCompatibleBitmap() с последующим копированием в контекст принтера. Правда, судя по логам, они для этого используют PatBlt(), но скорее всего проблема одна и та же. Прорисовка линий осуществляется с созданием bitmap'а с длиной и шириной, совпадающей с размерами линии. У меня проблема воспроизводится только при копировании в контекст принтера из совместимого контекста памяти (с помощью BitBlt). SelectBitmap может и не вызываться - проблема всё равно есть. При копировании пустой неинициализированной области в wine то же самое, в windows - пустой лист. PatBlt заполняет контекст текущей кистью, если вызывать её сразу после CreateCompatibleBitmap() и SelectObject(). В wine работает корректно... Непонятно, как проверить, на каком этапе портится картинка. GetPixel(), например, не работает с контекстом принтера и возвращает всегда CLR_INVALID. Хотя это наверное нормально, у нас принтер не поддерживает просто такую функцию. Вывод в контекст принтера осуществляется функцией StretchDIBits, так как pBitBlt не определена. В то же время, на дисплей корректно выводится и с той, и с другой функциями. Кроме этого замечено, что при создании bitmap'а функцией CreateCompatibleBitmap(), он имеет размер 1х1 при привязке его к принтеру. Для дисплея - реальный размер bitmap'a. Из-за сбитой координаты могут быть проблемы, т.к. координата в тесте, например, принимают вид -999 вместо положенной 1 (?!) Ошибка вызвана некорректной работой SelectObject для контекста принтера. SelectObject вызывает PSDRV_SelectBitmap, которая просто возвращает 0, выводя fixme. Вывод на печать мусора обусловлен ошибкой в BitBlt, которая не проверяет значения, возвращаемого функцией GetDIBits. После исправления печатается просто белый лист. Данная ошибка обозначена на http://bugs.winehq.org/show_bug.cgi?id=2173 со статусом ABANDONED. Интересно следующее. При вызове CreateCompatibleBitmap() память для хранения непосредственно самих данных не выделяется, а размер битмапа устанавливается корректно. В Windows то же самое. Затем при вызове BitBlt() код пытается получить эти данные вызовом GetDIBits(), который завершается неудачей. После получения данные копируются в конечный DC функцией StretchDIBits(), которая до исправления ошибки пыталась копировать данные из неинициализированной области памяти. В случае работы с контекстом дисплея GetDIBits из BitBlt вообще не вызывается. Работает X11DRV_BitBlt, выполняющая все операции. Она получает информацию из переменной типа XPHYSBITMAP, определенной в X11DRV_PDEVICE. Все функции, рисующие через контекст принтера вызывают WriteSpool16, использующую postscript. Для корректного копирования данных функцией BitBlt она должна быть реализована со стороны PSDRV. Файл bitblt.c в комментариях содержит упоминание о BitBlt, StretchBlt, PatBlt, однако, реализована лишь PSDRV_PatBlt. WriteSpool16 записывает все функцией write непосредственно в файл. Откуда потом BitBlt должна брать данные исходной DC - непонятно. В X11DRV используется переменная типа XPHYSBITMAP, ничего подобного PSDRV_PDEVICE нет. Нужно записать принятое решение по правильной реализации совместимого с принтером DC. Ошибка сильно мешает работе. Попробую исправить. При попытке писать в CompatibleDC на самом деле ничего не происходит, не создаётся файл, не выделяется память, и записи никакой нет. Пробуем реализовать запись в совместимый DC (создавать временный ps-файл), а потом копировать его при вызове PSDRV_PatBlt(). Идея с созданием CompatibleDC с выводом в postscript работает. Осталось только правильно всё оформить и реализовать копирование из одного контекста в другой. Совместимый контекст создаётся, и в него можно записывать (пока в c:\temp.ps) При реализации функций копирования, скорее всего, нужно будет перенести StartDocA и StartPage в функции работы с битмапом (примерно то же самое по End*-функциям). Надо либо доделывать хак, либо смотреть что у нас с DIB и серьёзно браться. (In reply to comment #18) > Надо либо доделывать хак, либо смотреть что > у нас с DIB и серьёзно браться. > Гм... а разве DIB не GSOC-проект? Нет, не GOS. Кстати, в рассылке wine-devel автор обсуждал не так давно что он сделал, надо действительно с ним согласоваться, и помочь подвинуть его разработку. Там уже почти всё сделано :) *** Bug 2450 has been marked as a duplicate of this bug. *** Наверное, нужно всё-таки написать хак. Лучше медленное решение печати, чем вообще без неё. Исправить BitBlt будет возможно только после решения баги 2789 *** Bug 3506 has been marked as a duplicate of this bug. *** Нужно проверить в 1.0.11 Тест, воспроизводящий проблему, приложен к баге. (In reply to comment #25) > Нужно проверить в 1.0.11 > Тест, воспроизводящий проблему, приложен к > баге. > Ошибка воспоризводится, создана отдельная бага для создания временного хака: http://bugs.etersoft.ru/show_bug.cgi?id=4156 *** Bug 5052 has been marked as a duplicate of this bug. *** Выложил группу патчей. Решение проблемы заключается в том, чтобы создавать dib секцию для битмапов, совместимых с контекстом принтера. Также была реализована функция PSDRV_SetDIBits для загрузки битового поля в эту секцию. Проблему с печатью удалось пока решить для картинок с глубиной цвета 24 bpp. Тестировал на файлах формата PNG и bmp - успешно печатаются в 1с8. Для поддержки картинок с другой глубиной цвета необходимо выделять битовое поле с максимальной глубиной цвета - 32 bpp. В функции PSDRV_SetDIBits надо реализовать преобразование из битового поля, получаемого от приложения, в битмап с этой максимальной глубиной. бутылка bugs/664 обновляю: $ wine --update запускаю тест: $ wine a.out.so fixme:exec:SHELL_execute flags ignored: 0x00000100 то есть, как я понял, тест ошибку не воспроизводит.каким-либо образом еще проверять нужно? По тесту проверять не надо. Я думаю, эта бага вообще далеко не закрыта, потому что сделанное решение проверено только для баги 5052. Тут вообще надо смотреть по заявкам - что у них была за проблема, и отписываться им, если работает. Я думаю, это чуть позже, когда будет полное решение. бутылка 1c81/1c81AccountingBase. запустил 1С, база торговля. Открыл файл с:/ps/screen.mxl, нажал печать -> "печать в файл" текст и картинка корректно отображены в jpg-файле Клиентам предварительно анонсировано о решении проблемы. Но думаю стоит проверять, как сказал Виталик, по каждому случаю. Выложил еще один патч. Дело в том, что предыдущие изменения внесли ошибку. В программе checkxml фон стал отрисовываться перевернутым. Это связано с изменениями в SetBitmapBits. Вместо этого при печати картинка теперь переворачивается в StretchBlt и на работу X11DRV никак не влияет. 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
Нельзя ли приложить скриншот или постскрипт как должно быть? (In reply to comment #35) > Нельзя ли приложить скриншот или > постскрипт как должно быть? А так не понятно, что картинка троится? Created attachment 1554 [details]
Оригинал картинки к гарантийному талону
Извиняюсь, вчера не успел приложить
Created attachment 1556 [details]
postscript-вывод при печати спецификации компьютера
Created attachment 1557 [details]
Оригинал картинки к спецификации копмьютера
> Created an attachment (id=1557) [details]
> Оригинал картинки к спецификации
> копмьютера
Чтобы решить именно эту проблему - сохраните картинку в bmp формате с глубиной цвета 24 bpp. После этого 1С должна ее нормально печатать.
Было установлено обновление 1.0.12. Проблема не исчезла. На месте графического изображения на печать выводиться прямоугольник заполненный черным цветом. Приложение из которого производится печать: 1С:Предприятие 8.2 Операционная система: Ubuntu 9.10 тестировалось с изображениями в форматах: jpg и png (In reply to comment #41) > Было установлено обновление 1.0.12. Проблема > не исчезла. На месте графического > изображения на печать выводиться > прямоугольник заполненный черным цветом. > > Приложение из которого производится > печать: 1С:Предприятие 8.2 > Операционная система: Ubuntu 9.10 > тестировалось с изображениями в форматах: > jpg и png > Вы печатаете рисунки с глубиной цвета 24bpp? Из Комментарий #40 видно что пока осуществляется печать только таких изображений. Да, я прочитал комментарий относительно bmp 24bpp. Но мне требуется использовать изображение с прозрачным фоном, т.к. должно быть видно то, что написано под изображением. В данном случае bmp не поможет. Возникла довольно острая потребность в печати изображений с прозрачным фоном. Каковы ориентировочные сроки исправления бага с печатью таких изображений? (In reply to comment #44) > Возникла довольно острая потребность в > печати изображений с прозрачным фоном. > Каковы ориентировочные сроки исправления > бага с печатью таких изображений? Работаем, будем стараться решить на неделе. Это было бы просто замечательно! Если возможно - держите, пожалуйста, в курсе, как оно продвигается. (In reply to comment #44) > Возникла довольно острая потребность в > печати изображений с прозрачным фоном. Не могли бы Вы приложить такое изображение к баге? Необходимо для тестирования. Если есть возможность, лучше прислать mxl файл, демонстрирующий проблему с прозрачностью. Created attachment 1629 [details]
Ценник с прозрачностью
Created attachment 1630 [details]
Вывод при печати в файл ценника с прозрачностью
Created attachment 1631 [details]
Ценник с прозрачностью - оригинальный BMP
В качестве прозрачного при добавлении картинки в 1С выбран белый цвет
Выложил патч. Добавил преобразование картинок из 32 bpp в 24 bpp. Поэтому сейчас поддерживается печать и тех и других. Картинки с расширением png также корректно печатаются. скажите пожалуйста, когда можно будет загрузить обновленный пакет? Принято. WINE@Etersoft 1.0.12 eter5/eter4 (In reply to comment #53) > скажите пожалуйста, когда можно будет > загрузить обновленный пакет? > Вы можете заказать сборку на странице продукта с меткой testing Проблема печати изображений с прозрачным фоном еще не решена. На нее заведена отдельная бага: http://bugs.etersoft.ru/show_bug.cgi?id=5445 Нужно ли отписываться по заявкам? изображение http://bugs.etersoft.ru/attachment.cgi?id=1557 по-прежнему печатается неправильно (см. http://bugs.etersoft.ru/attachment.cgi?id=1556) То же самое изображение печатается корректно после преобразования в BMP или PNG (In reply to comment #58) > изображение http://bugs.etersoft.ru/attachment.cgi?id=1557 > по-прежнему печатается неправильно Эта картинка в jpeg формате. На проблему завел багу: http://bugs.etersoft.ru/show_bug.cgi?id=5549 Откатил патчи: 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 wine@eterhack bottle bugs/664 WINE@Etersoft version 1.3.25-eter1.8 1с77, торговля и склад. Все печатается корректно. Откатил в 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) Надо будет проверить, работает ли без него. eterhack bottle 1c77/664 $ ww --version WINE@Etersoft SQL 1.3.36/2.0.0-eter1.4/8 Печать корректна. |