Summary: | 1Cv77: Не отображаются значки в окне Тестирования и восстановления (Нет необходимых символов в шрифте wingdings) | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Шрифты | Assignee: | Dmitry Timoshkov <dtimoshkov> |
Status: | CLOSED FIXED | QA Contact: | Konstantin Artyushkin <akv> |
Severity: | normal | ||
Priority: | P2 | CC: | kondratyuk |
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | Other | ||
OS: | Linux | ||
URL: | http://bugs.winehq.org/show_bug.cgi?id=7040 | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | 22 | ||
Bug Blocks: | 620, 1152, 3000 | ||
Attachments: |
Квадратики
Сравнение wine и windows terrible fonts |
Description
Vitaly Lipatov
2005-07-12 19:00:28 MSD
Принято. Галочка в окне новостей формируется из шрифта wingding (пока нет в WINE). Какими символами - пока не ясно. Символы в "Тестировании и исправлении" - не ясно чем. Знак v посередине в калькуляторе - нормально. шспользуются 0xA8, 0xFE из wingdings. Для галочки и часов в Тестировании и шсправлении используется 0xFC, 0xB9 из windings. Сейчас вместо них показывается Ь и ё Всё равно не показывает. Для релиза не принципиально. Возможно это связано с #22 Скорее всего связано с неверной перекодировкой символов для шрифта Symbol. Ссылка по теме: http://my.noteworthysoftware.com/?topic=5837 Для 1С этот патч не помог (я его приложил к сборке), но точно ясно что символ (в рекламной окне 1С) берётся из Symbol На галочки в тестировании и исправлении не влияет В репозитории wine-etersoft-devel в каталоге fonts/wingdings лежит два файла, один из них тот, который надо развивать: Wingdings-Regular.sfd Надо придумать способ проверки того, что идём верным путём - возможно устанавливать в блокноте этот шрифт и проверять как выглядит? Костя, с тебя - определить порядок работ, попробовать что получается, и передать Саше дальшейшую разработку. Можно в первую очередь нарисовать то, что подойдёт для Метатрейдера. Подготовил "пустые" символы шрифта, которые содержат описания, идентичные оригинальному win-шрифту. Осталось "всего лишь" нарисовать символы взамен пустышек. Первоначальная реализация шрифта есть в сборке, но нужно ещё дошлифовать для отправки в wine-patches. Переделываем, всё плохо... Предлагаю в самое ближайшее время начать отправку в wine. Отсутствие дизайнера блокирует решение данной баги. Нас этим шрифтом ждут уже третий год: http://wiki.winehq.org/CreateFonts Откладываем, bugs@ в ближайшее время делать ничего не будет. Нужно проверить в 1С 7.7 символы в календаре и в диалоге Тестирование и исправление. Возможно, багу можно закрыть. (Ответ Vitaly Lipatov на комментарий #17)
> Нужно проверить в 1С 7.7 символы в календаре и в диалоге Тестирование и
> исправление. Возможно, багу можно закрыть.
В календаре отображается всё. В Тестировании и исправлении галки тоже присутствуют.
Нашёл странный артефакт, которого нет в windos - справа после каждой надписи синий квадрат. Приложу скриншот.
Насчёт шрифтов всё хорошо, можно закрывать.
Created attachment 3711 [details]
Квадратики
Забыл указать версию wine в которой проверял: wine-etersoft-2.1.4-alt31.M80P.32.i586 wine-etersoft-sql-2.1.4-alt7.i586 wine-etersoft-gl-2.1.4-alt31.M80P.32.i586 Видимо, надо добавить скриншот из Windows, до и после нажатия кнопки «Выполнить» с расставленными слева галочками. Оказалось что речь идёт как раз о символах, которые расположены справа от текста. Данные символы в windows появляются после нажатия кнопки "Выполнить" и они отображают процесс выполнения. Как найти окно "Тестирование и исправление": 1) Запуск 1С77 в режиме конфигуратора 2) Далее из меню Администрирование "Тестирование и исправление ИБ" Первое отличие : в windows нет никаких символов справа от каждого действия, в wine пустой синий квадрат. В windows используют 2 символа: часы - в процессе выполнения действия, галочка - действие выполнено. В wine отображаются только синие и красные квадратики. Для наглядности приложу скриншот сравнение wine и windows. Created attachment 3712 [details]
Сравнение wine и windows
Бутылка swine 2.1 bugs/4 server:/net/wine/eter-2.1/bottles/bugs/wine-4.tar.gz 127M md5sum 53bc33d3c733e20f4501646241d0fe22 Воспроизведение через скомпилированный autoit скрипт: wine "C:\Program Files\CheckAndFix.ua3.exe" Дмитрий, посмотрите, пожалуйста. В наши дни это должна быть совсем простая проблема. (In reply to Konstantin Artyushkin from comment #22) > Оказалось что речь идёт как раз о символах, которые расположены справа от > текста. > Данные символы в windows появляются после нажатия кнопки "Выполнить" и они > отображают процесс выполнения. > > Как найти окно "Тестирование и исправление": > 1) Запуск 1С77 в режиме конфигуратора > 2) Далее из меню Администрирование "Тестирование и исправление ИБ" > > Первое отличие : в windows нет никаких символов справа от каждого действия, > в wine пустой синий квадрат. > В windows используют 2 символа: часы - в процессе выполнения действия, > галочка - действие выполнено. В wine отображаются только синие и красные > квадратики. > > Для наглядности приложу скриншот сравнение wine и windows. Галочка в вайновском wingding.sfd присутствует, однако там нет часов как на скриншоте. В OpenSymbol часов тоже нет, поэтому для тестирования скопировал символ в виде солнца (для наглядности) и сгенерировал новый wingding.ttf. Однако тестирование показало, что по прежнему вместо галочки и часов 1С в диалоге проверок рисует синие и красные квадратики. Для дальнейшего исследования скопировал wingding.ttf из Windows в c:\windows\fonts в префиксе с 1С и повторил проверку - и снова 1С рисует только квадратики. Повторил операцию копирования так же для marlett.ttf и symbol.ttf - и по-прежнему 1С упорно рисует только квадратики. Далее я сгенерировал +font лог для исследования. В логе нашел следующую интересную последовательность вызовов: hfont = CreateFont("Wingdings", -16); SelectObject(hdc, hfont); ExtTextOut(hdc, 0x0451, 1); Напишу программу для проверки, как это работает. Дело в том, что для шрифтов в кодировке SYMBOL коды глифов располагаются в диапазоне 0xf000 - 0xf0ff, и что происходит при указании 0x451 неясно. В связи с результатами исследования пока можно сказать следующее: 1. Новая проблема никакого отношения к шрифту Wingdings не имеет. 2. Эту задачу нужно закрыть и открыть новую. 3. На будущее - необходимо проверять теории об источнике возможных проблем, чтобы избежать потери времени. Заметка себе: Гусарам на слово верить не нужно :) (In reply to Dmitry Timoshkov from comment #26) > Далее я сгенерировал +font лог для исследования. В логе нашел следующую > интересную последовательность вызовов: > hfont = CreateFont("Wingdings", -16); > SelectObject(hdc, hfont); > ExtTextOut(hdc, 0x0451, 1); > Напишу программу для проверки, как это работает. Дело в том, что для шрифтов > в кодировке SYMBOL коды глифов располагаются в диапазоне 0xf000 - 0xf0ff, и > что происходит при указании 0x451 неясно. Написал тестовую программу, которая создает шрифт "Wingdings" с lpCharSet SYMBOL_CHARSET и рисует в окне строку, сосотящую из одного юникодного символа 0x451. Под Windows моя программа выводит в окно символ часов, под Wine - квадратик. (Ответ Dmitry Timoshkov на комментарий #27)
> (In reply to Dmitry Timoshkov from comment #26)
> > Далее я сгенерировал +font лог для исследования. В логе нашел следующую
> > интересную последовательность вызовов:
> > hfont = CreateFont("Wingdings", -16);
> > SelectObject(hdc, hfont);
> > ExtTextOut(hdc, 0x0451, 1);
> > Напишу программу для проверки, как это работает. Дело в том, что для шрифтов
> > в кодировке SYMBOL коды глифов располагаются в диапазоне 0xf000 - 0xf0ff, и
> > что происходит при указании 0x451 неясно.
>
> Написал тестовую программу, которая создает шрифт "Wingdings" с lpCharSet
> SYMBOL_CHARSET и рисует в окне строку, сосотящую из одного юникодного символа
> 0x451. Под Windows моя программа выводит в окно символ часов, под Wine -
> квадратик.
Очень круто!
Видимо, там есть какая-то никому не известная хитрость с кодами символов?
Задачу закрывать не будем, но я её переименую.
Мне кажется, это будет очень почётно, исправить багу №4 :)
(In reply to Vitaly Lipatov from comment #28) > > > Далее я сгенерировал +font лог для исследования. В логе нашел следующую > > > интересную последовательность вызовов: > > > hfont = CreateFont("Wingdings", -16); > > > SelectObject(hdc, hfont); > > > ExtTextOut(hdc, 0x0451, 1); > > > Напишу программу для проверки, как это работает. Дело в том, что для шрифтов > > > в кодировке SYMBOL коды глифов располагаются в диапазоне 0xf000 - 0xf0ff, и > > > что происходит при указании 0x451 неясно. > > > > Написал тестовую программу, которая создает шрифт "Wingdings" с lpCharSet > > SYMBOL_CHARSET и рисует в окне строку, сосотящую из одного юникодного символа > > 0x451. Под Windows моя программа выводит в окно символ часов, под Wine - > > квадратик. > > Очень круто! > Видимо, там есть какая-то никому не известная хитрость с кодами символов? Да, видимо что-то подобное. Я сейчас попробовал хак с WideCharToMultiByte и 0x451 с CP_SYMBOL (кодовая страница для SYMBOL_CHARSET) и вызов завершается неудачей, однако WideCharToMultiByte(CP_ACP, 0x451) завершается успешно и возвращает 0xb8. После добавления 0xb8 + 0xf000 freetype возвращает индекс глифа часов и моя программа рисует часы как в Windows. Нужно будет попробовать написать тестовую программу. К слову: 0x451 - это русская буква 'ё'. > Задачу закрывать не будем, но я её переименую. > Мне кажется, это будет очень почётно, исправить багу №4 :) :)) (Ответ Dmitry Timoshkov на комментарий #29)
> Да, видимо что-то подобное. Я сейчас попробовал хак с WideCharToMultiByte и
> 0x451 с CP_SYMBOL (кодовая страница для SYMBOL_CHARSET) и вызов завершается
> неудачей, однако WideCharToMultiByte(CP_ACP, 0x451) завершается успешно и
> возвращает 0xb8. После добавления 0xb8 + 0xf000 freetype возвращает индекс
> глифа часов и моя программа рисует часы как в Windows.
>
> Нужно будет попробовать написать тестовую программу.
>
> К слову: 0x451 - это русская буква 'ё'.
На всякий случай добавлю, что 1С использует 8-битную кодировку (например, cp1251), в которой, действительно, 0xb8 — это буква «ё». Но о Unicode она понятия не имеет, потому что выпущена до того, как в Windows в 2001 году добавили поддержку Unicode (в Windows 9x — задним числом, с помощью библиотеки unicows.dll)
Никакого смысла перекодировать 0xb8 в Unicode нет, а вот про 0xf000 это интересно. Но это уже хитрости общения с freetype.
(In reply to Vitaly Lipatov from comment #30) > > Да, видимо что-то подобное. Я сейчас попробовал хак с WideCharToMultiByte и > > 0x451 с CP_SYMBOL (кодовая страница для SYMBOL_CHARSET) и вызов завершается > > неудачей, однако WideCharToMultiByte(CP_ACP, 0x451) завершается успешно и > > возвращает 0xb8. После добавления 0xb8 + 0xf000 freetype возвращает индекс > > глифа часов и моя программа рисует часы как в Windows. > > > > Нужно будет попробовать написать тестовую программу. > > > > К слову: 0x451 - это русская буква 'ё'. > На всякий случай добавлю, что 1С использует 8-битную кодировку (например, > cp1251), в которой, действительно, 0xb8 — это буква «ё». Но о Unicode она > понятия не имеет, потому что выпущена до того, как в Windows в 2001 году > добавили поддержку Unicode (в Windows 9x — задним числом, с помощью > библиотеки unicows.dll) Юникод поддерживается в Windows начиная с самых первых пре-релизов NT 3.1 1991 года, еще до официального выпуска стандандарта Unicode 1.0, именно этим фактом (выпуск раньше стандарта) объясняется несовместимость кодировки первых 256 символов между Windows и Unicode, которая ведет к необходимости патчения автоматически сгенерированных таблиц в Wine для обеспечения работы некоторых программ (включая 1С). В Windows 95 юникод так же поддерживается, но только для вывода текста и файловой системы. Информация о unicows и 2001 год не соответствует действительности, но я бы не хотел развивать эту тему здесь. > Никакого смысла перекодировать 0xb8 в Unicode нет, а вот про 0xf000 это > интересно. Но это уже хитрости общения с freetype. Нумерация глифов в Symbol шрифте TrueType начиная с 0xf000 - это стандарт, и этот факт не специфичен для freetype. Что касается перекодировки из Юникода, то это и есть интересный момент, для которого пришлось делать небольшое исследование. Есть два способа вывода не юникод текста в Win32 (текста в cp1251 и других): 1. DrawTextA/ExtTextOutA: A версии API используют кодировку текущего шрифта, выбранного на HDC, для перекодирования переданного текста в юникод и затем вызывают W версию API. 2. 1С делает примерно следующее: hfont = CreateFont("Wingdings", SYMBOL_CHARSET); SendMessageA(hwnd, WM_SETFONT, hfont); SendMessageA(hwnd, WM_SETTEXT, textA); Обработчик сообщения WM_SETTEXT использует текущую системную ANSI кодировку для перекодирования переданного текста в юникод и затем вызывают W версию API. Сейчас способ #1 работает корректно в Wine так как шрифтовая подсистема всегда использует юникод для получения индексов глифов от freetype и никаких трюков не требуется (за исключением поддержки старых Symbol шрифтов, которые не следовали стандарту нумерации глифов в Symbol шрифте TrueType начиная с 0xf000). Способ #2 же сейчас не работает, так как фактически юникодный текст был сконвертирован с использованием неверной кодировки. Именно поэтому и нужна обратная перекодировка. Я создал патч, добавляющий поддержку #2 и отправил его для принятия в winehq. Ждем комментариев от Huw и AJ, возможно они предложат другой способ решения данной проблемы. (In reply to Dmitry Timoshkov from comment #26) > Галочка в вайновском wingding.sfd присутствует, однако там нет часов как на > скриншоте. В OpenSymbol часов тоже нет, поэтому для тестирования скопировал > символ в виде солнца (для наглядности) и сгенерировал новый wingding.ttf. Для добавления в вайновский wingding.sfd пришлось поискать шрифт, содержащий глифы с похожим начертанием и совместимой с LGPL лицензией. Нашел Android Emoji и скопировал из него 12 глифов с часиками. После перегенерирования wingding.ttf 1С успешно рисует часики и галочки в диалоге тестирования базы (патч с перекодировкой так же должен быть приложен). Отправил патч с новыми глифами Wingdings для принятия в winehq. (Ответ Dmitry Timoshkov на комментарий #31) ... > Юникод поддерживается в Windows начиная с самых первых пре-релизов NT 3.1 > 1991 года, еще до официального выпуска стандандарта Unicode 1.0, именно Ну я не считаю, что NT это Windows :) Всё же WinAPI не оттуда растёт. > этим фактом (выпуск раньше стандарта) объясняется несовместимость кодировки > первых 256 символов между Windows и Unicode, которая ведет к необходимости > патчения автоматически сгенерированных таблиц в Wine для обеспечения работы > некоторых программ (включая 1С). В Windows 95 юникод так же поддерживается, > но только для вывода текста и файловой системы. Информация о unicows и > 2001 год не соответствует действительности, но я бы не хотел развивать > эту тему здесь. Ясно. ... > Что касается перекодировки из Юникода, то это и есть интересный момент, для > которого пришлось делать небольшое исследование. > .. > 2. 1С делает примерно следующее: > hfont = CreateFont("Wingdings", SYMBOL_CHARSET); > SendMessageA(hwnd, WM_SETFONT, hfont); > SendMessageA(hwnd, WM_SETTEXT, textA); > Обработчик сообщения WM_SETTEXT использует текущую системную ANSI кодировку > для перекодирования переданного текста в юникод и затем вызывают W версию > API. ... Да... Надо же, сколько мы там когда-то копались, и так и не разгадали это... > Способ #2 же сейчас не работает, так как фактически юникодный текст был > сконвертирован с использованием неверной кодировки. Именно поэтому и нужна > обратная перекодировка. > > Я создал патч, добавляющий поддержку #2 и отправил его для принятия в winehq. > Ждем комментариев от Huw и AJ, возможно они предложат другой способ решения > данной проблемы. Круто! (Ответ Dmitry Timoshkov на комментарий #32) > (In reply to Dmitry Timoshkov from comment #26) > > Галочка в вайновском wingding.sfd присутствует, однако там нет часов как на > > скриншоте. В OpenSymbol часов тоже нет, поэтому для тестирования скопировал > > символ в виде солнца (для наглядности) и сгенерировал новый wingding.ttf. > > Для добавления в вайновский wingding.sfd пришлось поискать шрифт, содержащий > глифы с похожим начертанием и совместимой с LGPL лицензией. Нашел Android > Emoji и скопировал из него 12 глифов с часиками. После перегенерирования > wingding.ttf 1С успешно рисует часики и галочки в диалоге тестирования базы > (патч с перекодировкой так же должен быть приложен). > > Отправил патч с новыми глифами Wingdings для принятия в winehq. Теперь остались такие вопросы: 1. Вы в обычном Wine запускали 1С ? То есть никаких проблем с его запуском в обычном wine сейчас нет? 2. Нам нужно сделать патч для WINE@Etersoft 2.1 (патч с перекодировкой, и шрифт, видимо, целиком скопировать можно). Патч для W@E, наверное, имеет смысл делать после принятия в апстрим вашего решения. (In reply to Vitaly Lipatov from comment #33) > Теперь остались такие вопросы: > 1. Вы в обычном Wine запускали 1С ? То есть никаких проблем с его запуском в > обычном wine сейчас нет? Да 1С прекрасно работает в текущем winehq. Я делаю только 1 манипуляции: 1. удаляю c:\windows\system32\drivers (там .sys драйвера, которые иногда падали раньше, так как они не нужны - по привычке удаляю). 2. необходимо менять текущую кодовую страницу в 1С Конфигураторе (так как проблема с галочками и часами не требует запуска 1С, а только Конфигуратора, то этот шаг можно не делать). > 2. Нам нужно сделать патч для WINE@Etersoft 2.1 (патч с перекодировкой, и > шрифт, видимо, целиком скопировать можно). > > Патч для W@E, наверное, имеет смысл делать после принятия в апстрим вашего > решения. Да, я планирую портировать исправления в W@E после принятия патчей. Сейчас AJ написал, что у Android Emoji несовместимая с LGPL лицензия (я думал, что так как этот шрифт - часть кода Андроид, то и шрифт под BSD-like лицензией). Видимо нужно будет найти другой шрифт или нарисовать часы самим. (In reply to Dmitry Timoshkov from comment #34) > Да 1С прекрасно работает в текущем winehq. Я делаю только 1 манипуляции: "2" :) (In reply to Dmitry Timoshkov from comment #31) > Способ #2 же сейчас не работает, так как фактически юникодный текст был > сконвертирован с использованием неверной кодировки. Именно поэтому и нужна > обратная перекодировка. > > Я создал патч, добавляющий поддержку #2 и отправил его для принятия в winehq. > Ждем комментариев от Huw и AJ, возможно они предложат другой способ решения > данной проблемы. Патч принят. (In reply to Dmitry Timoshkov from comment #32) > Для добавления в вайновский wingding.sfd пришлось поискать шрифт, содержащий > глифы с похожим начертанием и совместимой с LGPL лицензией. Нашел Android > Emoji и скопировал из него 12 глифов с часиками. После перегенерирования > wingding.ttf 1С успешно рисует часики и галочки в диалоге тестирования базы > (патч с перекодировкой так же должен быть приложен). > > Отправил патч с новыми глифами Wingdings для принятия в winehq. Так как оказалось, что у Android Emoji несовместимая с LGPL лицензия, то пришлось искать замену. Меня бы устроили либо набор иконок в векторном формате, либо шрифт с LGPL совместимой лицензией. Я нашел несколько вариантов шрифтов, но либо лицензия была сразу "non-free", либо free как у wikimedia, но не совместимая с LGPL 2.1 (однако совместимая с LGPL 3.0). Гугловские Noto и Android шрифты используют несовместимую с LGPL лицензию. Набор иконок Tango к сожалению не содержит максимально простых избражений часов, пригодных для адаптирования для глифов шрифта. Промучавшись с поисками и поняв, что скорее всего я ничего не найду, я решил попробовать нарисовать глифы сам, используя для изображения круг (циферблат), прямоугольники (стрелки часов) и 4 квадрата (метки для 12, 3, 6 и 9 часовых отметок на циферблате). Так как я не великий художник да и fontforge временами вызывает бурные эмоции при невозможности найти простой способ для реализации моих мыслей, то пришлось помучиться. Затем пришлось еще помучиться с кодировкой и именованием новых глифов. Однако в результате получились вполне приличные глифы (если не рассматривать их слишком пристально). Отправил новый патч для принятия в winehq. (In reply to Dmitry Timoshkov from comment #36) > Так как оказалось, что у Android Emoji несовместимая с LGPL лицензия, то > пришлось искать замену. Меня бы устроили либо набор иконок в векторном > формате, либо шрифт с LGPL совместимой лицензией. Я нашел несколько вариантов > шрифтов, но либо лицензия была сразу "non-free", либо free как у wikimedia, > но не совместимая с LGPL 2.1 (однако совместимая с LGPL 3.0). Гугловские > Noto и Android шрифты используют несовместимую с LGPL лицензию. Набор иконок > Tango к сожалению не содержит максимально простых избражений часов, пригодных > для адаптирования для глифов шрифта. Промучавшись с поисками и поняв, что > скорее всего я ничего не найду, я решил попробовать нарисовать глифы сам, > используя для изображения круг (циферблат), прямоугольники (стрелки часов) > и 4 квадрата (метки для 12, 3, 6 и 9 часовых отметок на циферблате). Так > как я не великий художник да и fontforge временами вызывает бурные эмоции > при невозможности найти простой способ для реализации моих мыслей, то > пришлось > помучиться. Затем пришлось еще помучиться с кодировкой и именованием новых > глифов. Однако в результате получились вполне приличные глифы (если не > рассматривать их слишком пристально). > > Отправил новый патч для принятия в winehq. Патч принят. Портировал исправление с перекодировкой Symbol шрифтов для eter-2.1 и так же импортировал wingding.sfd/wingding.ttf с добавленными глифами часов из winehq в eter-2.1. Отмечаю эту задачу как решенную. Пожалуйста протестируйте исправления. Патч вошёл в сборку wine-etersoft-2.1.4-alt34.src.rpm нужно проверить, что символы появились. Created attachment 3714 [details]
terrible fonts
(Ответ Vitaly Lipatov на комментарий #38)
> Патч вошёл в сборку
> wine-etersoft-2.1.4-alt34.src.rpm
> нужно проверить, что символы появились.
Часы и галки появились, но также появилась проблема с отображением шрифтов в некоторых классах окон. На скриншоте показаны окна,в которых это сразу заметно.
(In reply to Konstantin Artyushkin from comment #40) > Часы и галки появились, но также появилась проблема с отображением шрифтов в > некоторых классах окон. На скриншоте показаны окна,в которых это сразу > заметно. Константин, можете сделать тест на регрессию и выяснить, какой патч вызывает такой эффект со шрифтами? Это оказалась параллельная проблема. Она отсутствует в сборке alt32 Эту закрываю |