Summary: | 1Cv77: Неверно обрабатывается масштаб при печати | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Печать ; Диалог печати | Assignee: | Svetlana Zhukova <svzhu> |
Status: | CLOSED FIXED | QA Contact: | Svetlana Zhukova <svzhu> |
Severity: | critical | ||
Priority: | P3 | CC: | andrey.chichak, anshdo, baraka, boris, dtimoshkov, kondratyuk, leonid, vitperov |
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 443, 777 |
Description
Vitaly Lipatov
2006-03-24 18:39:46 MSK
Масштаб обрабатывается не верно. При установке 50%, как будто получается 25%. Да, масштаб и по ширине не являются взаимозаменяемыми. При установленном масштабе 50%, и выборе По ширине в результате получаем около 50% на экране. Почему-то оказалась закрытой. шсправлю Похожий глюк с масштабом наблюдается и в windows, и зависит от выбранного принтера. Нужно провести дополнительное тестирование к баг-фикс релизу 1.0.8 Воспроизвёл на последней сборке. Масштаб выставляется неверно, вместо 50 установленных отображается никак не больше 25. Во-первых, сломано игнорирование указанного масштаба при выборе "по ширине страницы". Во-вторых, нужно сформулировать внятный тест, и приложить файл, на котором объяснять проблему. Боря, надеюсь со вторым поможешь ты. Диалог "Параметры страницы" выглядит очень странно: - после нажатия на ОК должна вызываться функция IsDlgButtonChecked для определения состояния всех checkboxes и radiobuttons, но она не вызывается ни разу - невозможно найти CALLBACK функцию для этого диалога Скорее всего сам диалог не системный, а внутренний, и CALLBACK функция тоже внутренняя. В выходном файле не содержится такого параметра как масштаб. Масштаб учитывается при прорисовке каждого элемента. Т.е если сохранять страницу в файл с разным масштабом, то отличия будут только в координатах отдельных элементов Было подозрение что масштабирование производится 2 раза: масштабированием элементов, и задание масштаба в драйвере принтера. масштаб в драйвере определяется параметром dmScale. Если принудительно поставить его 100, то масштаб всегда 100% Никаких прямых обращений к этому параметру в коде wine нет. Масштабирования внутри кода прорисовки PostScript тоже не нешёл. Скорее всего 1C сама выполняет масштабирование. т.е 1с сама должна заполнять структуру PSDRV_DEVMODEA. Кроме того она сама должна различать выбор "по ширине". Всё это должно быть в Callback функции диалога "Параметры страницы", которая должна быть реализована внутри 1с. Поэтому проблем с выбором "по ширине" быть не должно! Ещё бага воспроизводится при предварительном просмотре. Вообще прорисовкой элементов в окне предварительного просмотра должна заниматься 1с (хотя это надо проверить). Вообще надо подробней разобраться в механизме работы предварительного просмотра Мне кажется я уже объяснял десять раз. Никакого механизма нет. Изображение либо рисуется на принтерном DC, либо на совместимом DC (это мы потом видим на экране), одним и тем же кодом. Вся отрисовка производится с помощью функций из GDI32. Проблемы с масштабом сильно мешают при печати отчётов. Проверил. Масштабирование происходит 2 раза. Масштабный коэффифиент получается в квадрате. т.е ставим 50%, получаем 0.5*0.5 = 25%. Чтобы получить 50% надо поставить корень(0.5) = 70% если в PSDRV_MergeDevmodes при копировании принудительно выставить масштаб 100%: (добавить строку): dm2->dmPublic.u1.s1.dmScale = 100; , то в предварительном просмотре всё начинает работать идеально! Даже работает выбор "По ширине". Но при масштаб игнорируется, и печатается 100% Если применить другой подход: записывать в dm1->dmPublic.u1.s1.dmScale квадратный корень от dm2->dmPublic.u1.s1.dmScale, то печатается нужный масштаб. НО: 1) Не правильно работает предварительный прсмотр 2) Не правильно работает выбор "По ширине" 3) После печати сбивается масштаб в настройках. Если, например, поставить туда 30%, то напечатается именно 30%, но сразу после печати масштаб там станет 54% (корень(0.3) = 0.54), и в следующий раз печататься будет уже с другим мастабом. Опытным путём определил, что изменение параметра dm2->dmPublic.u1.s1.dmScale (откуда копируется масштаб) ни на что не влияет. сделал временный хак. В дальнейшем нужно написать программу (доработать готовую), и на ней воспроизвести данную багу. Масштаб в диалоге запрашивается при помощи функции PSDRV_FindPrinterInfo Притом срабатывает именно второй выхов ( который происходит по условию if(pi->ppd->DefaultPageSize) ) При предварительном просмотре MergeDevmodes вызывается из: fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET fixme:psdrv:PSDRV_CreateDC CALL fixme:psdrv:PSDRV_CreateDC RET fixme:psdrv:PSDRV_CreateDC CALL fixme:psdrv:PSDRV_CreateDC RET Возможно поэтому сделанные изменения работают неправильно. Думаю следует вынести коррекцию масштаба из MergeDevmodes, и применять её после вызова там, где это необходимо. При вызове диалога принтера функция MergeDevmodes вызывается из: fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET при печати: fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET fixme:psdrv:PSDRV_FindPrinterInfo CALL_2 fixme:psdrv:PSDRV_FindPrinterInfo RET fixme:psdrv:PSDRV_CreateDC CALL fixme:psdrv:PSDRV_CreateDC RET fixme:psdrv:PSDRV_CreateDC CALL fixme:psdrv:PSDRV_CreateDC RET На первый взгляд никаких отличий по сравнению с предварительным просмотром. Если выполнять коррекцию масштаба сразу после MergeDevmodes и только в функции PSDRV_CreateDC, то исчезает проблема с самопроизвольным изменением масштаба после печати. Но предварительный просмотр по-прежнему работает неправильно Ошибся: на масштаб при печати влияет вызов MergeDevmodes из PSDRV_ExtDeviceMode Изменение масштаба при вызове PSDRV_CreateDC влияет как на печать, так и на предварительный просмотр. Для правильной работы в функции PSDRV_CreateDC масштаб изменяться не должен. Если принудительно ставить масштаб 100% после вызова MergeDevmodes из PSDRV_CreateDC, то бага полностью решается. Работает даже предварительный просмотр, и выбор "по ширине". Патч отправил. *** Bug 2939 has been marked as a duplicate of this bug. *** Из дублирующей баги: Документ построен и отображается. Заходим в "Параметры страницы" - Масштаб - меняем его (например 30% - то что я пробовал). Сохраняем параметры. Совершаем "контрольный заход" в те самые параметры страницы - стоит 30% нажимаем педальку напечатать, получаем не тот результат что ожидали. Смотрим параметры страницы - стоит 54%. прикидываем видимый на странице результат и оно похоже как раз на эти 54%. Сценарий по #26 воспроизвелся: после печати в файл масштаб печати изменился с 30 на 54% *** Bug 2847 has been marked as a duplicate of this bug. *** Да, вижу. Только не знаю в чём может быть проблема. На моих исходниках всё замечательно работает. Возможно мой патч был принят как-то наполовину. Сейчас попробую заново склонировать ветку eterhack Разобрался. Не приложен патч, убирающий предыдущий хак. В рассылке письмо называлось: [Wine-patches] [Eterhack] Revert "Hack for eterbug #61" В следующей сборке всё должно работать (сейчас 41.35) wine@eterhack bottle 1c77/1c77 WINE@Etersoft SQL 1.5.23/2.1.0-eter1/1 Проблемы вернулись. (В ответ на comment #19) > Если применить другой подход: записывать в dm1->dmPublic.u1.s1.dmScale > квадратный корень от dm2->dmPublic.u1.s1.dmScale, то печатается нужный масштаб. > НО: > 1) Не правильно работает предварительный прсмотр > 2) Не правильно работает выбор "По ширине" > 3) После печати сбивается масштаб в настройках. Если, например, поставить туда > 30%, то напечатается именно 30%, но сразу после печати масштаб там станет 54% > (корень(0.3) = 0.54), и в следующий раз печататься будет уже с другим мастабом. > > Опытным путём определил, что изменение параметра dm2->dmPublic.u1.s1.dmScale > (откуда копируется масштаб) ни на что не влияет. Например,берем документ: 1с77-документы-учет материалов-поступление материалов-печать В windows: 1.Файл-параметры страницы. Если стоит 100% при предварительном просмотре отображается страница в натуральную величину,если установить 50% - на предварительном просмотре изображение отображается соответственно указаному %. 2. После печати выбор масштаба в настройках сохраняется. 3. Выставляю в параметрах страницы масштаб 30%,одновременно выбираю "по ширине" При предварительном просмотре страница отображается корреткно (таблица в ширину страницы). В wine. 1.Файл-параметры страницы. Если стоит 100% при предварительном просмотре отображается корректно.Если установить 50% - на предварительном просмотре страница оттображается сильно уменьшенной (оценивая на глаз,примерно как 30% на windows ) 2. После печати выбор масштаба в настройках также сохраняется,данной проблемы теперь нет. 3. Выставляю в параметрах страницы масштаб 30%,одновременно выбираю "по ширине" При предварительном просмотре страница отображается будто "по ширине" не выбрано,а масштаб зрительно соответствует корректному 30% в windows. (В ответ на comment #36) > 3. Выставляю в параметрах страницы масштаб 30%,одновременно выбираю "по ширине" > При предварительном просмотре страница отображается будто "по ширине" не > выбрано,а масштаб зрительно соответствует корректному 30% в windows. Я правильно понял, что проблема проявляется только если *одновременно* задать масштаб и выбрать "по ширине"? (В ответ на comment #37) > (В ответ на comment #36) > > 3. Выставляю в параметрах страницы масштаб 30%,одновременно выбираю "по ширине" > > При предварительном просмотре страница отображается будто "по ширине" не > > выбрано,а масштаб зрительно соответствует корректному 30% в windows. > > Я правильно понял, что проблема проявляется только если *одновременно* > задать масштаб и выбрать "по ширине"? Мое тестирование показывает, что исправлять нечего. Под Windows 1C 7.7 ведет себя полностью аналогично. Если указанный принтер - PostScript, то он *не игнорирует* dmScale, заданный в DEVMODE, не PostScript принтер масштабирование игнорирует. Отправленный ранее в winehq тест подтверждает это поведение. Скорее всего к путанице ведет ошибка в 1C, что программа не трактует настройку масштаба в процентах и настройку "по ширине" как две отдельные настройки, что и подтверждают первые комментарии в этой задаче. (В ответ на comment #37) > Я правильно понял, что проблема проявляется только если *одновременно* > задать масштаб и выбрать "по ширине"? Да. Рома, тогда верни хак, добавив условие «только для 1С 7.7». Нужно проследить, что новый вариант (с условием попал в 2.0, 2.1 и eterhack). Хак возвращен в eterhack и eter-2.1, добавлено условие "только для 1с77". Теперь масштаб соответствует выбранному,но только в том случае,если на стоит галочка "по ширине". Если галочка все же стоит,то не зависимо от числа (будь то 30% или 200%),указанного в ячейке "масштаб",при предварительном просмотре отображается мелко (ну...примерно 10%) (В ответ на comment #48) > Теперь масштаб соответствует выбранному,но только в том случае,если на стоит > галочка "по ширине". > Если галочка все же стоит,то не зависимо от числа (будь то 30% или > 200%),указанного в ячейке "масштаб",при предварительном просмотре отображается > мелко (ну...примерно 10%) wine@eter-2 bottle 1c77/1c77 WINE@Etersoft SQL 2.1.0-eter9/1 Проблема принимает вид "Некорректно обрабатывается условие "по ширине" ". Никто не жаловался на этот факт,откладываю. (В ответ на comment #50) > Проблема принимает вид "Некорректно обрабатывается условие "по ширине" ". > Никто не жаловался на этот факт,откладываю. Я не понимаю. Как это работало в 2.0 или 1.0.12? Всё было нормально? И сейчас должно оставаться так же. Если что-то изменилось, багу вернуть на исправление. swine -h eter-1.0.12 1c77/1c77 WINE@Etersoft 1.0 SQL 1.0.12-eter14/28 файл-открыть - ведомость.mxl (на с:) Предварительный просмотр и печать работают корректно - масштаб документа соответствует выставленному, если стоит галочка "по ширине" - масштаб игнорируется,документ печатается по ширине листа. В данной бутылке файл job_4979-214.pdf ,распечатанный при условии,что стоит галочка "по ширине",при этом в неактивном окне"масштаб" выставленно 20% (документ напечатан по ширине листа). swine 2.0 1c77/1c77 WINE@Etersoft SQL 2.0.3-eter27/5 Также корректно. пособ проверки аналогиченвышеуказанному. swine -h eter-2.0 1c77/1c77 WINE@Etersoft SQL 2.1.2/2.1.0-eter5/2 Предварительный просмотр и печать работают корректно. закрываю. |